4 月 23 - 24 日,我参加了由 Think 技术社区举办的 SwiftCon大会。这次大会见到了很多新老朋友,也从嘉宾的分享中学习了很多,微博上对于此次大会也有一些争议,一并写个参会感想,分享一下我的观点。
分享笔记
首先分享一下我两天听分享的收获。
一个 Swift 项目的网络层变迁——陈乘方
陈乘方负责开发 ENJOY 这个 App,ENJOY 是一个比美团和点评更「上档次」的美食推荐和团购应用。而 ENJOY 是一个由纯 Swift 语言开发出来的 App。陈乘方的这次分享中,我感受到了大家 ENJOY 这个项目对于 Swift 新特性的接受和演进过程。
大家刚开始写 Swift 项目的时候,都是把 Objective-C 翻译成 Swift,那个时候,虽然我们用的语言是 Swift,但是我们的思维方式还是 Objective-C 的,所以,陈乘方首先介绍了在项目演进过程中,大家对于 Swift 新特性的引入,从而带来编码方式的变革过程。
他们使用枚举、范型、以及 protocol extension 作为第一个演进版本,使得自己的项目更加 Swift 化。
接着第二个演进版本,他们将 AFNetworking 进行了替换,改成了 Alamofire。比较关键的一点,他们把成功和失败的双回调,合并成 completion
单回调,所以就产生了 APIResult
对象:
enum APIResult<T> { case Success(T) case Failure(NSError, AnyObject?) } |
这种改进是更加 Swift 化的尝试,因为 APIResult
这种保存网络结果的方式,是一种对数据的封装,可以更加方便地使用map
和 flatMap
进行链式调用。
最后一个演进版本,他们:
- 用 ObjectMapper 代替了 Mantle
- 去掉命名前缀
- 用 Struct 类型的 Model
- 尽可能减少 optional 的 Model 属性
- 为 APIResult 增加了 map 和 flatMap 方法
整个演进过程中,我能感受到他们对于 Swift 的最佳实践也是一步一步摸索得更加清晰。除了总结性的介绍外,陈乘方在演讲的后半部分,还以一个具体的 API 请求为例,展示代码的整个生成过程,让我更加清晰地理解了他们的应用架构方式。
这个主题分享非常适合那些刚刚迁移到 Swift 语言的新项目,他们可以从中吸取到宝贵的实践经验。
最后恭喜 ENJOY 获得了 3000 万美元的新一轮融资,以及陈乘方本人抽中了今年 WWDC 的门票,ENJOY 公司会报销陈乘方参加 WWDC 的全部费用,真是良心公司,大家投简历去吧,哈哈。
Objective-C 和 Swift 的跨平台开发——Tinyfool
tinyfool 的这个分享我很早以前听过,当时应该是在网上看的他参加博览网的分享,分享地址 在这里,当时他分享的主题是《如何把 iOS 代码编译为 Android 应用》。这次分享的题目虽然不一样,但实质内容是一样的。
这其实是一个非常有技术含量的事情,tinyfool 基本上把他们要做的事情讲了,但是并没有深入到细节讲怎么做。这其实是完全能够理解的,因为这些细节讲起来会非常碎,在场的人也很难有谁有这方面的需求做同样的事情。所以基本上,这件事情大家了解他是如何着手计划和实施的,就可以了。
不过这场分享,很多人表达出不满意。我想 tiny 如果抛出两个技术细节,让大家玩味一下会更有意思一些。
逆向工程:从 Objective-C 到 Swift——包涵卿
这个分享非常对我的味口,因为我一直对 iOS 安全非常关心。
包涵卿在演讲中,介绍了他使用 Hopper Disassembler, IDA Pro, otool, class-dump 逆向分析 Objective-C 和 Swift 的编译后代码。其中涉及的技术细节都非常有意思。
例如 Non Fragile Layout,这种编译方案,使得父类增加成量变量,不会影响子类的二进制代码运行。这样,苹果就可以在新的 iOS 操作系统中,默默地升级 NSObject,UIView 和 UIViewController 这些大家都会继承的父类的成员变量,而不会影响原有的代码运行。这个技术细节感觉国内并没有多少人是真正理解清楚的。
关于这个,我记得王晓磊给我的公众号投稿过一篇名为 Objective-C 类成员变量深度剖析 的文章,也对这个特性做了详细的分析。
包涵卿还介绍了 Swift-String 的内部实现,通过介绍它的大小是是 24 字节,一步步分析,最后还原出原来是它有一个 _core 的变量,类型是一个 _StringCore 结构。这个结构里面有三个变量:_baseAddress, _countAndFlags, _owner。
包涵卿接着介绍了 Swift-Demangle 的细节,一个 Swift Protocol 的指针大小是 40 字节的逆向分析。
包涵卿介绍了一个超有用的分析命令ima lookup -a <address>
,可以查对应地址可能是什么对象,有这个命令之后,在分析对象组成的时候,就方便很多了。
最后,我了解到 protocol witness,它是一个类似 C++ 的虚方法表的实现,这让我理解了 Swift 对 Protocol 的实现方式。
拥抱 Swift 3.0 与未来展望——图拉鼎
图拉鼎是奇点和 Manico 的作者,也以 Remote 的方式为 ENJOY 工作过。
图拉鼎的这次分享,首先介绍了 Swift 3.0 的目标:
- ABI 稳定
- 跨平台
- Package Manager
接着,他分享了 Swift 2.2 在语言演进上的变化,包括:selector、keyPath、去 Objective-C 化、标准化命名、参数化命名、废除 IUO 。
这些语言变化对我都很有帮助,特别是标准化命名这一点,方法名加 ed 结尾统一表示返回新的对象,例如:sort 是在原数组排序,sorted 是返回的是新数组。类似的还有 reversed, enumerated 等。这种命名方式设计是非常舒服的,而我之前并没有注意到这一点。
废除 IUO(Implicityly Unwrapped Optional) 这一点对我启发也很大,我们了解到苹果对于语言的演进过程,其实就能理解哪些是好的设计,哪些是不好的设计。
最后,图拉鼎介绍了 Swift 未来的 演进方向:
- SE-0025: Scoped Access Level
- SE-0038: Package Manager C Language Target Support
- SE-0048: Generic type alias
对此,我最大的收获是知道了原来可以 从这里 看苹果对于 Swift 语言未来的规划,相信我以后会常常到这里翻翻,看看苹果是如何做计划的。
图拉鼎还介绍了一个好的学习平台,IBM 的 Swift sandbox: https://swiftlang.ng.bluemix.net,听他说这个平台更新非常及时,可以方便我们实验 Swift 的新特性。
Redux in Swift——新一代的 iOS 应用架构——方志刚
方志刚自己在 playground 上做了一个用于演讲的程序,可以播放 PPT + 看代码,而且你知道吗?这是他在第一天演讲的现场撸出来的。真是后生可畏啊!
在这个分享中,方志刚分享了一个小众的、新颖的架构方案:Redux。在介绍完架构后,方志刚直接上代码,带着我们一步一步演示如果用 Redux 开发出一个 TODO 的应用。Redux 优点:好测,简单,可缓存,时光倒退模式这些都让人感觉耳目一新。
但是,我最大的收获倒不是这个框架本身。我相信一个新的框架肯定也会有各种各样的问题,我最大的收获是方志刚在介绍如何把这个框架改造成支持异步的时候,提出了一个 Inverse Of Control 的方案:把 dispatch 反转控制,交给异步的线程来回调。
我不知道未来我是否会有类似的设计架构的需求,如果我以后也有改造现有框架,让它支持异步的方案时,我应该会仔细评估方志刚的这种设计方式,还是挺有意思的。
How to parse float numbers - the really hard way——傅若愚
每次听傅若愚的分享,我都有智商被碾压的感觉,不过每次回头再仔细学习他的 keynote,我总是会收获很多。其实我的 Swift 烧脑系列文章,有几篇都是在傅若愚的演讲中得到的启发。
这次我听到他一下子定义了大量操作,将 Monad, Application 和 Functor 都实现并且应用在浮点数转换中时,我又知道我得会后再下功夫了。
其实傅若愚也明白这一点,他将所有的讲稿和代码都放到了 GitHub 上,大家可以自行学习。
读 Swift 源码,理解 Monad——唐巧
我自己的分享,主办方把我放在中午饭之后,让我压力山大,为了让大家不睡着,我带大家一起伸了懒腰,是的,我们大会所有人一起举起双手伸了一个大懒腰。然后,我结合《引爆点》这本书,给大家讲了一个段子:「如何成为 iOS 大 V」。
热场大概花了 10 分钟吧,然后就进入正题讲 Monad。整体语速还是有点稍快,现场没有提词器,我不得不时不时回头,对观众还是挺不友好的。最后演讲完,我让听懂的同学举手,现场大概有一半的同学举手表示懂了。
我自己学习 Monad 大概断断续续花了一年时间,能够在 40 分钟内让现场有一半的同学听懂,我认为值了。这场演讲是我准备得最多次数的演讲,在正式演讲前,我一共讲了五次(一次给 Lancy,一次公司内部分享,一次给 T 线下沙龙,一次给南京软件技术大会,一次给汤圣罡),也是我认为最有挑战的演讲内容吧,整体来说,我给自己打 90 分。
没听懂的同学,对不住了,我已经尽力了。如果你没听懂,建议再学习一下相关的资料:http://t.cn/Rq4fwJk、http://t.cn/Rqp3GiW、http://t.cn/RL5pYwM
其它
以上几个分享,是我认真听了,并且觉得非常值得总结的。除此之外,由于我和会场的朋友聊天,错过了「从数学函数角度理解函数式编程——丁峰」,「Swift 语言的设计取舍及跨语言调用——董一凡」,「Asynchronous Programming in Swift,Swift 异步编程——刘冠杉」这三个分享,所以无法总结。
「Swift 设计模式——老镇 (曾伟) 」这个分享我听了,我觉得稍微有一些问题,因为老镇只是把这些设计模式一一介绍,其实这样并不是很有效。作为分享,还不如选一两个点,结合 Swift 的源码来理解,可能更好一些。不过老镇对这次分享准备得非常认真,写了一万多字的讲稿,举了大量武侠的例子,没能深入也蛮可惜的。我感觉还是他经验太少,在内容组织上没有经验,期待他以后会演讲得更好。
关于对会议的讨论
从昨天开始,twitter 和 微博上就有人开始喷这次 SwiftCon 会议,我感觉实在犯不着,因为这次大会有相当多的内容都是精心准备的,如果有一两场不合你的胃口,也不用攻击整场会议。这次 SwiftCon 会议的分享内容,在我以上总结到的分享,都是高质量的,而这些总结,已经覆盖了超过半数的分享议题了。如果你仅仅拿一两场的分享说事,明显犯了以点盖面的错误。如果有谁觉得不对,建议也能够详细指出每一场分享到底水在哪里,让讨论能够更加客观和公正。
另外,微博上发泄或者互喷是相当浪费时间的,有这个时间还是看看技术文章,看看开源代码吧。整个互联网圈子已经够乱了,我还是希望我们 iOS 圈子能够少一些偏激,多一些心平气和的讨论。
最后,我要说,这次会议其实是非赢利的,首先所有讲师都没有报酬的。我从锅巴和板子那里了解到,所有的大会志愿者,也是没有任何劳务报酬的,大会的主持吴柯瑶(其实她是一个 iOS 开发者)也是没有任何报酬的。那为什么要收门票呢?因为分享的场地设备得花钱,外地讲师的路费和住宿费得花钱,所以这些钱需要通过门票来补贴。
如果你能理解这是一个完全民间的团体,组织的一次非赢利性的大会,他们都是本着做事和分享的态度来做这个会议,那么我相信你的心态会更加宽容一些。这是上海有史以来的第一次 Swift 大会,所有人都希望它办成功,这个过程中有什么不如意的,我们改进就行了,没有那么不可原谅的。
愿大家开心~