Swift对于很多iOS程序员来说都是个谈虎色变的话题,因为Swift版本不稳定、混编有坑、迁移费劲…其实究其原因,最主要的还是开发者懒得改变、懒得再次学习、赖得重写代码。对于很多重量级App来说历史包袱确实很重,情有可原,但对于新的App来说,尝试用Swift开发是个收益很客观的方式,初期熟悉的时间可以很快的被后期开发速度的优势、维护的成本所弥补。并且为了方便大家使用Swift,苹果也在与OC混编方面下了很大功夫,所以整天在想着用这种自动化工具、那种平台来提高开发效率的你完全可以大胆的尝试将Swift引入你的App。
本人一月前开始学习Swift,经历了从OC到Swift的迁移过程,从刚开始的步履维艰到后来的如沐清风,感觉自己和这个更美更难追的姑娘重新谈了一场恋爱。今天想和想要转Swift的朋友和对Swift有着好奇之心的OC开发者们来谈谈我的再一次恋爱。
苹果为Swift创建了专门二级页:https://developer.apple.com/swift/这是个广告页,但是上面恰到好处的总结出了Swift之于OC的优势。在该页面的最顶部,就有来自于苹果官方的推销语:
Swift is a powerful and intuitive programming language for macOS, iOS, watchOS and tvOS. Writing Swift code is interactive and fun, the syntax is concise yet expressive, and Swift includes modern features developers love. Swift code is safe by design, yet also produces software that runs lightning-fast.
译:Swift是macOS、iOS、watchOS和tvOS上强大而直观的编程语言。编写Swift代码具有交互性和趣味性,语法简洁但富有表现力,而且Swift包含了开发人员喜欢的现代特性。Swift代码在设计上是安全的,但同时也能生成运行速度极快的软件。
苹果一向喜欢用特别夸张的形容词来夸赞自己的产品,但是刚和Swift谈了一个月恋爱的我却觉得这些形容词用的非常恰当。
在这段句话之下,又有一行大大的标题
Open Source
是的,虽然这不是苹果的一贯风格,但在Swift上苹果做到了开源。开源就意味着编程语言变成白盒,每个开发者都可以更了解供自己吃饭的语言,更可以为了它的发展出份力(要是能提一行代码就够吹一辈子了)
Platform Support
除了开源,Swift还有另外一大吸引人的强大特点,就是跨平台。官方宣布支持 iOS, macOS, watchOS, tvOS,Linux。但Swift到现在已经可以开发服务器和安卓了,尽管距离真正的跨平台还有一定距离,但这个方向一定是苹果开发者的福音。想象一下,有朝一日,年近不惑、只会OC的我们发现iOS只占有市场3%的时候,这将是多么恐怖的一件事情。
从这以上简短但被苹果置顶的描述中也可以看出Swift之于OC几个最主要的优势:
Swift代码更好写
Swift更安全
Swift更快
Swift开源
Swift跨平台
那么,接下来,分别对这几个方面阐述一下为什么Swift真的有优势
1. Swift代码更好写
苹果官方对于Swift为啥更好写,有如下总结:
Named parameters brought forward from Objective-C are expressed in a clean syntax that makes APIs in Swift even easier to read and maintain. Inferred types make code cleaner and less prone to mistakes, while modules eliminate headers and provide namespaces. Memory is managed automatically, and you don’t even need to type semi-colons.
从Objective-C中迁移来的API写法更简洁,更易于阅读和维护。类型推断使代码更简洁,更健壮,去掉了引用头文件并提供名称空间。内存自动管理,不需要键入分号。
Swift摒弃了很多OC的历史包袱,OC语法最让别的开发者吐槽的就是它的中括号,尽管苹果一直鼓吹这是更贴近自然语言的设置,但如OC之父Brad Cox所说,这样设计的初衷还是因为这种新语法可以避免和C的冲突,以及包起来可以更好的体现这是一条消息。但为了编译器的方便却给开发者入门带来了麻烦,对于不习惯OC的C++、JAVA程序员来说,这样的语法简直就是灾难。尝试在自己的工程中搜索[[[[,你一定可以搜到不止一处的!
不仅如此,Swift还摒弃了C语言的包袱——伴随我们多年的分号;,C语言之父Dennis Ritchie表示,分号是结束语句的一种统一方式。但发明分号更主要的目的是为了机器理解起来方便,所以还记得最开始学习C语言的时候,经常会编译不过,最后发现是某行少了分号。直到后来编程的时候写上分号都成为了肌肉记忆,这其实就是一种人类对机器的妥协了。新时代的语言更应该让机器向人类妥协,Swift取消了很多语义分割,让代码可以更清晰的表达逻辑,相信转职后的你也一定会有这样的体会。
另外,@符号被去掉、if else等条件判断不再需要圆括号、String拼接更加方便、更方便的懒加载,这些特性都客观的提高了语言的易读性、降低了其他技术站开发者转行的门槛。
Swift中还有很多OC中不支持,但非常实用的新特性。诸如:
类型推断(从此不用在定义时就显示的给出变量类型,编译器可以靠上下文进行推断)
引入了命名空间,从此不用再import其他文件
告别MRC,全面使用ARC
结构体可添加方法、支持拓展、支持协议
函数支持可选参数,支持多返回值,支持函数入参,为函数式编程提供了强大支持。
可嵌套可添加方法可传参的枚举
支持泛型
想更多跟详细的了解其他特性可以花20分钟阅读一下官方文档的基础部分
The Swift Programming Language - The Basic
什么?英文不好?那就花10分钟读这个翻译版吧
The Swift Programming Language - The Basic - 中文版
2. Swift更安全
Undefined behavior is the enemy of safety, and developer mistakes should be caught before software is in production. Opting for safety sometimes means Swift will feel strict, but we believe that clarity saves time in the long run.
译:未定义的行为是很大的安全隐患,开发者的错误应该在软件投入生产之前被发现。为了更好的安全性,Swift会更加严谨,但我们相信从长远来看,清晰能节省时间。
Swift的安全性是其主打的第一大特性,也是我认为Swift优于OC的最大的一点。OC的动态性一直是OC开发者所鼓吹的一大优势,但在优势的背后伴随着的是安全隐患。语言过于暧昧会导致很多不可预测的问题。比如向nil发送消息在OC中并不会使程序崩溃,这看起来很安全,但不崩溃并不代表没bug,恰恰相反,这样的特性到是成为了问题的源泉,这一切都是因为一个暧昧不清的nil。
Swift也有nil,但此nil非彼nil。请看一下苹果的文档
Swift’s nil isn’t the same as nil in Objective-C. In Objective-C, nil is a pointer to a nonexistent object. In Swift, nil isn’t a pointer—it’s the absence of a value of a certain type. Optionals of any type can be set to nil, not just object types.
译:Swift的nil和OC的nil不是同样的概念,在OC中,nil是一个指向不存在对象的指针。在Swift中,nil并不是一个指针,而是代表一个特定类型值不存在。不光是对象,基本类型、结构体、枚举都可以被设置为nil
OC允许变量为nil,而nil并不明确的代表没有,而代表指向空对象的指针,它还是个指针,而空指针无法很明确的表示不存在。而Swift提出了可选(Optional)的概念,从此,变量只有存在和不存在两种状态、方法调用因此也只存在调了和没调两种情况,去除了OC对于nil指针的种种不确定性。有了存在和不存在,就可以很明确的指出合法和非法,例如对于存在的对象一定可以调用它的方法、不存在的就一定不去调用了;String到Int类型转换成功就一定会返回一个特定类型的对象,失败就一定返回不存在。而这一强大特性又可以被用在各种类型上,在很大程度上提高了语言的严谨性。
Swift is a type-safe language. A type safe language encourages you to be clear about the types of values your code can work with. If part of your code requires a String, you can’t pass it an Int by mistake. Because Swift is type safe, it performs type checks when compiling your code and flags any mismatched types as errors. This enables you to catch and fix errors as early as possible in the development process.
译:Swift是个类型安全的语言,类型安全的语言需要开发者清楚每个变量的类型。如果你需要一个String类型的参数,就绝不能错误地将Int传递给它。正因为Swift是类型安全的,它在编译期对你的代码进行类型检测并指出错误,可以今早发现代码中的类型错误。
除了“可选”的概念之外,类型安全也是Swift安全性的一大体现。在OC中,如果将一个CGFloat赋值给NSInteger,并不会使代码编译不过,但是冥冥之中就损失了精度。在之后的计算中就有可能因为精度问题而导致Bug,而这些Bug有时候是不好被发现的。在Swift中,不同类型之间的赋值都需要经过类型转换,否则编译器会报错。在写类型转换代码的同时,正是你考虑精度的时刻,这样的设计最开始会让你觉得Swift好烦人、好不智能,就像个老太太一样唠唠叨叨,但就是这样的机制保证了类型安全、使得语言更加严谨,代码运行结果更加可预测。
3. Swift更快
Swift is intended as a replacement for C-based languages (C, C++, and Objective-C). As such, Swift must be comparable to those languages in performance for most tasks. Performance must also be predictable and consistent, not just fast in short bursts that require clean-up later. There are lots of languages with novel features being fast is rare.
译:Swift的诞生是为了替换基于C的语言(C、c++和Objective-C)。因此,在大多数场景下,Swift的性能必须与那些语言相当。性能也必须是可预测的和稳定的,而不能只是能短时间的爆发,之后需要冷却时间的。在拥有现代语言新特性的语言中,速度也快是很罕见的。
Swift拥有很多新语言的特性,但并不像很多新语言那样为了开发方便而舍弃性能。各个语言速度对比可以看下图:
从图中可以看出,比Swift更快的更省资源的基本都是较为年长的语言,而那些融入了很多强大方便新特性的年轻语言们效率基本都在Swift之下。这样足以证明苹果用Swift取代C系语言之决心,一个又快又好用的语言才是未来。
在与OC的速度对比中,苹果官方声称Swift的速度是OC的1.4倍,也有人用for循环证明Swift速度还没有OC快,这两种实验都有各自的水分。但由于Swift的类型安全,使得它可以使用类似C++虚函数表的方式解决OC运行时发消息慢的问题,很多函数调用都从层层消息变成了取址调用,再加上更强大的编译优化,就有足够的理由让开发者相信Swift的效率。
总结来说,Swift的性能绝不会是它的短板,再综合考虑到它的种种新特性和性能的取舍,就会觉得性能其实它真的是一个很全能的语言。
4. Swift开源
苹果一直以来都是一个不太开放的公司,对于OC而言,开源了Runtime、CF已经算是历史飞跃了。但Swift是完全开源的,并且不只是能看,还能提代码。并且不光是Swift本身,Swift-Clang、LLVM、LLDB等都是开源的,只要你有时间就能通读整个Swift世界。当然大部分开发者一定没时间通读整个Swift世界的代码,但开源就像给开发者画了一张大饼,提供了无限的可能性。
开源代码都在苹果的Github上:https://github.com/apple,有兴趣的同学日后可以先都Clone下来镇镇电脑。
5. Swift跨平台
Swift除了可以基于苹果系统和Linux开发以为还可以进行服务端开发,很多服务端框架支持了Swift,这使得Swift的跨平台行有了真正意义上的飞跃,具体请见文章:服务端写Swift体验
另外Swift还可以开发安卓App、Windows应用,不过虽然可以开发,但是实际语言生态确是非常不成熟的,所以对于其他平台的支持还有很长的路要走。
Swift的诸多优点让OC开发者有足够的动力和信心去接受这门新语言,作为一个开发者来说,时刻保持一颗Open Mind是很重要的,对于新的事物过早下定论或由于自己不熟悉而无故吐槽,是一个程序员被淘汰的很大的原因。如果OC真的像各位想象的那也好的话,苹果也不会花那么大心思去创造Swift。
最后,拿出祖师爷来镇镇场
参考文献
The Road to Code: An Interview with Brad Cox
The Development of the C Language
Swift.org
Swift- Apple Developer