主力 Swift 或许真的要等一等

主力 Swift 或许真的要等一等

CyandevCyandev
最近看到网上一些对于 Swift 的观点,这里想说几句。

从 2014 年发布到现在已经快三年的光景,可以说如今的 Swift 已经比初代要好太多,回想一年前刚接触 iOS 开发那阵,我第一个接触的语言就是 Swift,而不是 Objective-C,Swift 给我一种十分清新的感觉,写出来的代码清晰、优雅。天真的我从一开始就不正眼看 Objective-C 一眼,觉得它是编程语言中的怪胎,语法繁琐、丑陋...

但是渐渐地,我发现 Swift 似乎并不是那么好用,最明显的一点就是 Xcode 对 Swift 的支持十分不稳定,经常会出现 SourceKit 进程崩溃导致编辑器变身纯文本,这对于像我一样的初学者十分极其特别地不友好,我一度陷入了深思:iOS 开发怎么比 Android 还不堪啊?于是我转身学了 Objective-C,这时我发现,它可能才是我的首选。所以从那时起一直到现在,我始终在使用 Objective-C 来做一些小东西或者搞一些研究,而 Swift 在我心中就是备胎的位置,偶尔拿出来玩一玩。

这篇文章我想简单对比一下 Objective-C 和 Swift,它们的应用场景究竟如何。

Objective-C

Runtime 是 Objective-C 中十分重要的一个特性(严格来讲不是特性,因为语言是基于它实现的),我们都知道 App Store 审核十分严格,不允许在上架后动态下发可执行文件,也就是说,你不能动态更新 app 中的功能或者修复其中的漏洞,这对于我们个人开发者来说可能不是十分 critical,但是对于大型的 app 来说(比如 QQ、手机淘宝)是非常致命的,更新版本的周期太长,对于一些紧急活动或者漏洞,开发者需要能够远程控制 app 的某些行为,由于 Runtime 的支持,使用 JavaScriptCore 开发的 JSPatch 就能实现这一点,因为 Apple 并没有限制 JavaScript 的使用。关于动态性的内容这里就不多说了,有很多实现方案。

Objective-C 另外一个比较重要的好处就是与 C 的交互性优秀。因为 Apple 的一些较低层框架提供的是纯 C 的 API,而这里 Objective-C 调用这些 C API 就十分自然,最多只需要考虑手动 retain、release 的问题。

Swift

Swift 解决了一个 Objective-C 中最主要的一个问题:语法。Swift 语法显然比 Objective-C 的要好太多,不分头文件的组织方式避免了 #import 的繁琐,还有很多 handy 的语法特性,如模式匹配、更严格的 Optional 类型、强大的范型支持、可 Immutable 的原生类型、更方便的 String、闭包语法的优化、元组等等等等,让我一一列举的话就太多太多了。

这些特性解决了一个什么问题呢?就是 Objective-C 编程范式的缺失,Objective-C 至今也没有一个像样的范型支持,最近出的 kindof 语法也跟 Java 范型似的就是个鸡肋,Array、Dictionary 必须放置 NSObject 对象。这些确实是 Objective-C 的槽点。

然而 Swift 去掉了动态性的支持,方法派发机制也默认不使用消息派发了,需要显式注明 @objc 来将其注册到 ObjC Runtime 中,NSInvocation 也不允许使用了,这点就十分不好,Apple 似乎想让 Swift 更 Pure 一些,但是对于一些企业级 app 来说显然就不太现实了。

此外 Swift 与 C 的交互并不是很友好,除了需要 Bridge 头文件以外,语法也是很繁琐。尤其是指针相关的操作,一上来会让人一头雾水。

总结一下

其实到现在为止 Swift 离替代 Objective-C 还是很遥远,因为 Apple 内部一直在用 Objective-C 来做一些 Framework 的开发,低层也不可能用 Swift 实现,因此就算你只用 Swift 开发,也难逃一些 Objective-C 的影子,你能说 NSObject 一点都不用吗?Selector、KVO 哪些能逃得开 Objective-C?结合 Xcode 的稳定性,面向 Swift 开发确实不是应该随大流的。当然了,Swift 的发展也离不开开发者的努力,并不是说不要用 Swift,在一些非生产环境中,Swift 还是相当好用的,我个人虽然很多时候在用 Objective-C,但也一直在研究 Swift,关注它的成长。


没了。

文章被以下专栏收录
16 条评论
推荐阅读