Swift 2开发必备小Tip

2020-06-11 15:57:06 浏览数 (1)

Tip 1 柯里化(Currying)

在Swift 中可以将方法进行柯里化(Currying)1,也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并返回结果的新方法。举个例子,在Swift 中我们可以这样写出多个括号的方法:

然后通过只传入第一个括号内的参数进行调用,这样将返回另一个方法:

或者:

柯里化是一种量产相似方法的好办法,可以通过柯里化一个方法模板来避免写出很多重复代码,也方便了今后维护。

举一个实际应用时的例子,在Swift 中Selector只能使用字符串生成。这面临一个很严重的问题,就是难以重构,并且无法在编译期间进行检查,其实这是十分危险的行为。但是target-action 又是Cocoa 中如此重要的一种设计模式,无论如何我们都想安全地使用,应该怎么办呢?一种可能的解决方式就是利用方法的柯里化。Ole Begemann 在这篇帖子2里提到了一种很好的封装,这为我们如何借助柯里化,安全地改造和利用target-action 提供了不少思路。

Tip 2 将protocol 的方法声明为mutating

Swift 的protocol 不仅可以被class 类型实现,也适用于struct 和enum。因为这个原因,我们在写接口给别人用时需要多考虑是否使用mutating 来修饰方法,比如定义为mutatingfunc myMethod()。Swift 的mutating 关键字修饰方法是为了能在该方法中修改struct 或enum 的变量,所以如果你没在接口方法里写mutating,别人如果用struct 或者enum 来实现这个接口,就不能在方法里改变自己的变量了。比如下面的代码:

如果把protocol 定义中的mutating 去掉的话,MyCar 就怎么都过不了编译了:保持现有代码不变的话,会报错说没有实现接口;如果去掉mutating 的话,会报错说不能改变结构体成员。这个接口的使用者的忧伤的眼神,相信你能想象得出。

另外,在使用class 来实现带有mutating 的方法的接口时,具体实现的前面是不需要加mutating 修饰的,因为class 可以随意更改自己的成员变量。所以说在接口里用mutating修饰方法,对于class 的实现是完全透明,可以当作不存在的。

Tip 3 Sequence

Swift 的for...in 可以用在所有实现了SequenceType 的类型上,而为了实现SequenceType你首先需要实现一个GeneratorType。比如一个实现了反向的generator 和sequence 可以这么写:

如果想要深究for...in 这样的方法到底做了什么,就将其展开,大概会是下面这样:

顺便可以得到的收益是你可以使用像map、filter 和reduce 这些方法,因为SequenceType接口扩展(protocol extension)已经实现了它们:

0 人点赞