2016年1月10日,第一次由国内社区主办的iOS开发盛会 Swift开发者大会 将在北京举行,本次大会旨在推动Swift语言在国内的发展,不但邀请了国外资深专家,社区的传奇人物,还邀请了拥有Swift实践经验的国内专家,为你在实际项目中使用Swift扫清障碍。
ThoughtWorks的工程师、 SwiftyJSON 开源项目作者傅若愚将在大会上分享《越过Objective-C与Swift的鸿沟》话题,据了解,他们已经使用Swift开发商业应用近一年时间,InfoQ记者对他进行了专访,探讨Swift是否已经足够成熟的问题。
InfoQ:请介绍一下您在ThoughtWorks负责什么工作?使用Swift多长时间了?
傅若愚 :ThoughtWorks的工作内容往往一言难尽,可以这么说:有Coding,有Architecting,还有Couching,总之各种技术相关的有趣的事情。在ThoughtWorks,有的团队已经用了1年多的Swift了,比如我现在的这个团队,就正在使用Swift来为客户开发定制的iOS客户端产品。
InfoQ:最近苹果发布了Swift2.1版本,这门语言发展很快,您觉得新版本的Swift足够成熟了吗?
傅若愚 :应该说,Swift到达2.0以后,已经比较成熟和稳定了,今后大规模的语法更改不会像第一年这样频繁。然而作为iOS开发者,苹果的行事大家都懂,不断的变化和折腾肯定会是常态的。如何能够快速适应新的版本,迁移时尽量减少痛点,迭代时如何保持项目的稳定,这些问题依然会是Swift用于大型项目开发时的重点之一。
InfoQ:你们已经将Swift实际应用到生产项目中,能不能分享下使用Swift最让您想砸键盘的是什么?
傅若愚 :我们用Swift到现在1年左右了,经历了Swift 1.0,1.2以及2.0的各个版本在实际项目中的使用。其中的趟过的坑有的确实是让人痛不欲生,比如编译时间的问题(我们可以通过合理拆分多个Module,Build Pipe Line中利用之前的Index来解决),XCode Crash的问题(有条件的团队可以考虑App Code,XCode本身的升级也对此解决得很好),这些基本上都有解决的办法。要说真正的痛点,我认为还是在人的身上:我们的许多开发者,特别是对Objective-C非常资深的开发者在写Swift的时候往往习惯于用Objective-C的模式去做,非常依赖Runtime,这样的代码在Swift中往往很痛苦。我曾经跟同事打趣说今后项目加人的时候,我们得要写scala的开发者而不是写objc的,当然这只是一句笑话,但确实是说明我们开发者代码思维的转变非常重要。
InfoQ:您最喜欢Swift的什么特性?
傅若愚 :一个是Swift的类型系统很亮,当前较新的静态类型语言基本都借鉴了这些类似Haskell的特性,还有自动的加里化(currying),模式匹配等等,这方面倒无需多言。另一个就是Swift2.0引入的Protocol Extension了,Protocol Extension的引入一定程度上让‘面向协议编程’不再是一句空话,或将概念停留在某些设计模式的层面,而可能是实实在在的引发一些编程范式层面的变化,结合Swift本身非常Haskell Style的类型系统,开发者们可以更多地使用一些全新的视点去设计代码。
InfoQ:从实际的编程体验来看,相对于Objective-C,Swift是否提高了生产力和编程效率?
傅若愚 :Swift带来的生产力提高可以说是毋庸置疑的,但Objective-C并不会那么快消亡,就像函数式编程并不见得会取代面向对象编程。Swift的Code会更加轻盈,许多Haskell或F#中的理念可以轻轻松松地Port过来直接用。而Objective-C则更偏底层,更加厚重,传承自SmallTalk的消息转发机制和其Runtime给了它非常强大的力量,而往往能设计出令人惊异的代码。
InfoQ:目前关于Swift有一些新的概念出现,比如面向协议编程,您对这些新概念怎么看,Swift是否会出现新的设计模式?
傅若愚 :Swift中这些新概念带来的变化,往往并不仅仅发生在设计模式的层面,而是在编程范式的层面。比如现在火热的RFP(Reactive Functional Programming)的实现,在Swift社区中竟然出现了RAC与RxSwift双雄并立的局面。同时我们常常发现一些以前通过OO中的设计模式搞定的功能,现在或许更加适合使用Monadic Programming或者Parser Combinator等函数式的设计模式来做。
InfoQ:您自己也写了一个Swift开源库,您认为目前还有哪些关键地方缺少成熟的用Swift编写的开源库?
傅若愚 :目前GitHub上面纯粹用Swift写的开源库已经越来越多了,然而毕竟还有些东西是天然不适合单纯用Swift写一个Objective-C的替代版本的,举两个例子,一个Mapper,另一个是测试时的Mock框架,这些东西往往会需要大量地利用Runtime,并且往往立身于面向对象的编程范式内,那么我们与其去写一个纯粹Swift实现,倒还不如直接用以前Objective-C的库。
InfoQ:您对Swift的未来有什么看法?您认为Swift还有几年将成为iOS开发主流语言?
傅若愚 :我一直觉得,在较长一段时间内,Swift都会和Objective-C并存,再过几年后Swift很可能会更加主流,因为绝大部分App用Swift就已经够了,但Objective-C也会一直与我们相伴,去解决一些Swift不那么适合的场景。