前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift 2开发必备小Tip

Swift 2开发必备小Tip

作者头像
博文视点Broadview
发布2020-06-11 15:57:06
3680
发布2020-06-11 15:57:06
举报

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)已经实现了它们:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 博文视点Broadview 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档