# Day15--今天,我想来点.......扩展

扩展的主要功能:

扩展(extension)是 Swift 一个重要的特性,它可以为已存在的列举、结构、类别和协定添加新功能,而且不需要修改该型别原本定义的程序码。扩展也可以使用在内建的型别上,像是Int、Double或String等等。

Swift 的扩展可以:

  1. 新增计算属性(包含实体属性和型别属性)。
  2. 定义实体方法和型别方法(不能覆写已存在的方法)。
  3. 提供新的建构器。
  4. 定义下标。
  5. 定义和使用新的巢状型别。
  6. 让一个已存在的型别遵循某个协定。(资料来源:Swift起步走)

语法

如下所见,extension旁边接的会是型别,而假如要接协定的话就以“:”为中介,然後开始其他的东西……

计算属性

就以下例来说,扩展藉由增加计算实体属性的方法,来增加三个计算计算实体属性:

但要记得一件很重要事情:扩展不能新增储存属性,也不能为已有的属性添加属性观察器(property observer)。

扩展方法

这个例子里面我们针对一个整数来进行扩展:

基本上这个方法里面传入的值是一个闭包型别,这个例子有点好懂,反正最後就是会透过尾随闭包的手法,将我们要让扩展方法变成

扩展下的变异方法

而如果要以变异方法来做扩展的话,也是可以的,这时就要善用mutating与self的使用,在这里,self的指称就是回指向输入的值,因为我们是让输入的值发生改变,所以一定要加上mutating。

不然就会报错:

扩展与建构器

扩展可以为类别增加便利建构器,但指定建构器、解构器则无法新增。
在之前的篇幅中曾经提及,假若今日结构没有定义建构器,结构会有一个自动生成的成员逐一建构器,而扩展的便利建构器对於逐一成员建构器并无影响,仍能使用。

如上例,我们在扩展了Human後,就算我们能生成一个跟name有关的字串,也不会影响在定义结构Human所产生的预设成员逐一建构器。

扩展与下标

以下为扩展下的新增下标,这个下标主要在做的事情,是让搜寻的数字会回传数字字串中的数字。

扩展下的枚举

扩展可以为结构、类别、枚举新增巢状型别,如下:

中间段的部分是这样:
可以用case去套数字,最後会回传星期。
接着走访在阵列里面里面的数字,然後以.week的方式去把星期的内容套出来。

上述大概举了五六种例子来说明扩展的功能:
扩展(extension)可以为已存在的列举、结构、类别和协定添加新功能,而且不需要修改该型别原本定义的程序码。扩展也可以使用在内建的型别上,像是Int、Double或String等等。

我们在实例里面举了计算属性的扩展、方法的扩展、变异方法的扩展、建构器的扩展、下标的扩展、枚举的扩展
但我们也可以把扩展用在协定上,这样就不用再改动原先的扩展:

如图,我们先定义好两个协定,一个是正常轨道引用的协定,一个是扩展功能下的协定。

一个用正常轨道定义好了协定之後,就可以用类别来引入,然後另一个用扩展的方式处理,让Adam也有狼叫的功能
实体化之後,Adam就是个会狼叫的人了。

tags: 铁人赛

<<:  Day.22 SQL应用 - 表与表之间的连结 (JOIN)

>>:  [DAY16]模板按钮

作业系统的修课经验

今天要来分享的是我最喜欢的一门学科 - 作业系统! 进入正题 作业系统是资讯学系中的一门进阶课程,内...

30天学会C语言: Day 11-什麽都可以取名字

前置处理器(Preprocessor) 在程序码最前面内容,编译前编译器会依照这些内容进行不同的处理...

那些被忽略但很好用的 Web API / MessageChannel

热线你和我,这是一条情感的线路,属於你和我。 昨天我们认识了 PostMessage,它可以让我们...

[Day 29 - 小试身手] Todolist with React (4)

在上一章Todolist with React (3),使用 React-redux 完成了渲染任...

输家的特质-2

毫无纪律 每次进场都要拟定策略,停损、停利、摊平、加码,这些都是要事先拟定的,而不是情况一变,全部...