Swift大会填坑之旅
中国第一届Swift大会已于2016年1月10日于北京结束。会上内容非常全面有价值,在Github有资料分享,会议视频在慕课网上可以看到。没有现场参与会议还是深表遗憾。此篇文章作为阅读讲义后的初步总结,如有疏漏还望指正。
Think Functionally
Functor
,Applicative
和Monad
是函数式编程的三个重要概念。ReactiveCocoa就是这三个概念的实践。Functor
,Applicative
和Monad
是分别实现了接口(typeclas)的数据类型,并依次包含。最终使函数和数据可以通过统一的接口,处于一种平等的地位,无缝灵活地组合调用。这也是通向声明式编程的一种途径。帮助理解这三个概念的文章推荐雷纯峰的《Functor、Applicative 和 Monad》。
傅若愚主讲的《Objective-C to Swift》和包涵卿《Functional Programming》中均给出了用函数式思想流式处理异步代码的实践。包涵卿讲稿中涉及到的Promise和Nomad这两个很相似的概念,这两个概念又分别衍生出框架PromiseKit和ReactiveCocoa。Promise
倾向于对异步过程进行封装,通过一个队列维持依次执行的顺序。ReactiveCocoa
倾向于对数据的封装,以组合和数据流的形式执行方法。
翁阳《Swift改善既有代码的设计》的实现方式粗看和Monad
很像,实际上并不涉及数据流的传播,只是通过重载操作符巧妙地“隐藏”了异步操作中的嵌套,代码相互独立。在可读性上确实有了质的提升。
Protocol Struct and Enum
随着Protocol
重要性的增加,Swift已经具备纯正的面向接口开发能力。Protocol
已经全面支持Class
、Strut
和Enum
,可以自由组合并通过extension
来拓展行为,相比OC中通过Category
添加协议的主要作用是隐藏实现细节。Swift中接口作为一种数据类型可代表一类具有相同行为的对象,可以直接传递和调用,非常方便。
Struct
和Enum
的使用频率有非常大的增加,尤其是Struct
。在Swift标准库中定义了多大102个结构体而类只有5个。Struct
和Enum
已经具备同Class
一样的Properties
、Methods
和Protocol
能力,区别在于结构体和枚举类型不能继承,在参数传递过程中是复制传递,这能避免类对象通过引用传值引起不安全的多线程操作。结构体的效率也比类要高得多。所以在Swift中多推荐首选结构体。
李洁信在主讲的《Pop in Swift》中给出了两个用Protocol
解耦代码的例子。其中第二例子,MVVM中ViewModel使用Protocol
对View渲染的代码进行解耦,增强了代码的复用性,非常值得借鉴。
Performance
周楷文小哥带来的《Faster App》给出了优化程序性能的方案,讲的比较全面,且不限于Swift语言。性能优化通常都会涉及到后台执行耗时操作
和缓存复用
以及为了效率使用更底层的函数,具体方案根据使用场景而定。
- UI层面:
- AutoLayout适用的场景。在频繁复用、变化和动画的场景下并不推荐,尤其在UITableView和UICollectionView下极其耗费性能。
- 后台线程处理图片解码和裁剪,缓存及复用。在UITableView中的复杂的View可以缓冲甚至转换成图片来替代。
- 使用TextKit来进行文字排相关操作。
- 动画和视频选用恰当的底层函数。
- 网络操作:使用缓存和压缩传输数据。此外JSON数据和Model的映射上速度上Manual>YYModel>Mantel,在一般场景中并不需要考虑这个性能,会使用功能强大的Mantel。
- 文件操作:异步存取数据。
- 数据库操作:对比了CoreData和Realm。除了不是原生的支持外体积较大外,Realm在性能上完爆CoreData。
Swift Style And Building a Framework
gregheo小哥讲了一些关于Swift的编码规范,如何让代码清晰可读性强。在他的Github上有很具体的规范可以参考。
猫神的主题是《如何打造一个让人愉快的框架》,讲述了打造第三方框架需要注意的几个方面:
- API需命名清晰易懂,尽可能详细描述函数的行为,比如
recursivelyFetch
就比fetch
来的具体。 - 添加前缀不与其它库冲突,比如
f1_method
,f2_method
。 - 使用
Cocoapods
Carthage
和Swiftmanager
的注意事项。 - 版本管理1.0.0对应(major 公共 API 改动或者删减).(minor 新添加了公共 API).(patch bug 修正等)
最后猫神推荐了一个持续集成的方案fastlane,自动化部署frameworks。
总结
本来以为只是写个概要,怎奈讲稿的信息量比想象的大得多。光是去理解函数式编程从一个坑跳到另一个坑,而且适时选择不继续跳坑,这才断断续续花了近一周才完成这篇文章。对函数式编程和Swift特性的理解还不全面,需要进一步巩固。现在迫不及待想实践中应用学到的知识了。