1、@escaping(逃逸闭包)
如果一个闭包被作为一个参数传递给一个函数,并且在函数return之后才被唤起执行,那么这个闭包是逃逸闭包。并且这个闭包的参数是可以“逃出”这个函数体外的。
在swift3.0之后闭包默认是不可逃逸的,逃逸闭包需要使用@escaping属性标记。默认不可逃逸闭包 最明显的好处就是:编译器优化你的代码的性能和能力。如果编译器知道这个闭包是不可逃逸的,它可以关注内存管理的关键细节。而且你可以在不可逃逸闭包里放心的使用self关键字,因为这个闭包总是在函数return之前执行,你不需要去使用一个弱引用去引用self。
2、 Extension 的使用场景
私有的辅助函数:内部实现都写在一个私有的 extension 中
分组:有一组函数应该写在一起,我倾向于把他们放到一个 extension 中
遵守协议:把所有用来实现某个协议的方法放到一个 extension 中
模型(Model):使用 extension 将 Model 的属性和基于属性的计算分割开来。
详细介绍可以查看原文《 “错误”的使用 Swift 中的 Extension》
3、as、as!、as? 关键字
as:从派生类转换为基类,向上转型(upcasts)
as!:向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。
as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值。
可参考这篇文章开解
4、函数最多可以有一个可变形参,而且它必须出现在参数列表的最后,以避免使用多个形参调用函数引发歧义。如果你的函数有一个或多个带有默认值的形参,并且还有可变形参,请将可变形参放在所有默认形参之后,也就是的列表的最末尾。
5、willSet与didSet
属性观察者,类似于触发器。用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应。有如下特点:
1、不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet。
2、给属性添加观察者必须要声明清楚属性类型,否则编译器报错。
3、willSet可以带一个newName的参数,没有的话,该参数默认命名为newValue。
4、didSet可以带一个oldName的参数,表示旧的属性,不带的话默认命名为oldValue。
5、属性初始化时,willSet和didSet不会调用。只有在初始化上下文之外,当设置属性值时才会调用。
6、即使是设置的值和原来值相同,willSet和didSet也会被调用
可参考这篇文章