Swift 从 5.0 的 ABI 稳定到5.1 的模块稳定,Swift 终于不是《Swift 入门到重学》了。本次 WWDC2020,Swift 5.3 正式发布,Swift 依旧朝着安全、高效、易读的方向持续发力,不断的在改进语法,加强代码的表达能力和易用性。由于 Swift 的模块稳定,SPM 如今也支持了二进制模块的分发,逐渐完善的社区生态也在不断拓宽 Swift 能够涉足的领域,而不只仅是在 Apple 平台之上。git
下图展现了 WWDC2020 中 Swift 相关内容的脑图,但愿能够帮助你们快速了解。github
( WWDC 2020精彩内容思否专栏:https://segmentfault.com/blog... 编程
本篇内容来自于阿里巴巴淘系技术部,无线开发工程师星志。
更多精彩内容可关注【淘系技术】公众号。)swift
一门完善编程语言有三个最基本的要素:语法、标准库、调试能力。语法设计决定了语言的编程范式;标准库决定了语言的基本能力;调试能力决定了开发者的体验和语言的稳定性。
苹果在 Swift 的迭代过程当中不断的强化这几点,咱们能够来看看 Swift 又获得了哪些提高。segmentfault
Swift 的语法设计核心仍是 OOP,可是这不妨碍 Swift 的语法在支持 POP 和函数式编程甚至 DSL 获得的强化。Swift 也由于 SDL 特性的加入,开始逐渐的适应声明式编程的方向发展,好比后文提到的 @main 等等。安全
这个改进解决了当函数最后几个参数为闭包的状况下,致使的括号嵌套的问题,API 更加简洁也更加具备表达性。SwiftUI 利用这个语言特性,也变得更加简洁易懂。ruby
如今 KeyPath 能够当作函数来使用了。这个语法糖解决的问题当咱们使用相似 map
同样的函数时,只须要取出对应数据模型中的某一个属性,为此咱们不得不写相似 map { $0.property }
的代码,有了这个语法糖,事情就能够简化成了 map(\.property)
。闭包
引入了新的修饰符 @main
,能够标记在带有 public static func main()
函数实现的全部类型,不管 main 函数时从拓展来得仍是继承来的。添加这个特性的意义在与维持声明式的语义,将声明式语义进行到底。YES!app
之前咱们写逃逸闭包时若是捕获了 self,咱们须要在跟 self 有关的地方写上 self.
以警示咱们注意循环引用。编程语言
若是在闭包的捕获列表中显示声明捕获 self
,在闭包中对 self
相关的访问能够省略。若是是在不可变的函数中访问,self
能够直接省略(为了 SwiftUI)。
其实这一点改进有用可是覆盖面并非很广,由于在实际的应用中,咱们都是尽可能先弱引用 self
后再强引用 self
,来保证 self
的可访问性。在以下场景就得不到此项优化:
这种写法能够自动实现错误匹配,进入到对应的错误处理中,而不须要使用 switch,加强语言的可读性。
自动符合 Comparable
编译器如今能够自动为你生成 Comparable 的相关方法,实现 Enum 的比较。
Enum case 能够用来适配 protocol
这个特性看引用场景须要吧,官方给了一个比较好的例子。具体相关内容能够参考 SE-0280。
如今能够在 SwiftUI 等 Swift DSL 中使用 switch-case 来进行模式匹配,以前只有对 if-else 的支持。某种程度上也是为 SwiftUI 而生的能力。
其实这里说标准库是广义的标准库,其中包括了开发者随语言分发的标准库,如标准 I/O 库等,运行时环境,编译环境,一方库等等。苹果今年在这部分下足了功夫,由于标准库、各类各样的一方三方库才是展示一门语言能力的地方,不然再好的语法也不会有人用,语言终究仍是工具,能解决问题才是关键。
Swift 5.3 在代码尺寸和运行时都有不小的提高。Swift Package Manager(SPM)增长对二进制和资源的支持,深度集成 Xcode,亲儿子的优点逐渐显示了出来。Swift 原本设计的初衷原本就是一门 General Purpose 的语言,今年苹果正式宣布 Swift 支持了 Apple platform,Ubuntu/CentOS/Amazon Linux,不久的未来也会支持 Windows,正式成为一门优秀的跨平台语言。
从这些更新能够看出,苹果对 Swift 的底层操做很是关心,Swift System 的出现让使用 Swift 底层开发者脱离 OS C API 的折磨,得到更一致更健壮的代码体验。
在使用 UIKit 的状况下,Swift 4.1 时生成的二进制代码已经从 OC 的两倍还多,可是在 Swift 5.3 中,这个差距已经缩小到小于 1.5 倍了。也就是说以前大量使用 Swift app 会自动获得二进制大小的优化,而对于担心 Swift 会形成包大小问题的 App,如今已经不算是很大的问题了。由于只须要付出能够接受的代价,就能得到 Swift 带来的安全性能和开发体验。
若是 App 使用了纯 SwiftUI,二进制代码甚至能够缩小 43% 之多。可见苹果优化 Swift 的功底之深,并且这些优化,只须要重新编译一次便可享受,何乐而不为。
由于 Swift 更紧凑的值类型,运行时的内存,分配相同的对象所需的空间天然比 OC 更小。Swift 5.3 相较 5.1,运行时的必要额外信息存储要少很是多,甚至作到了比 OC 还要少,大大减少了 Swift 的运行时内存。这对低内存的设备是很是有帮助的,同时,更少的系统内存意味着更多的用户内存。而这一切,只须要从新编译便可。
Swift 底层的不断优化也让其成为一门高效的语言,下降运行时的要求,就能够提高其应用的场景。
SPM 做为 Swift 生态很是重要的一环,也迎来了更新。
这两点更新已经代表了 SPM 的能力已经足够完善了。目前具备必定规模 App 的内部模块都开始使用 Cocoapods 作二进制组件化的集成,这样能够明确对代码解耦,提升打包的效率。在这样的背景之下,SPM 对这两点关键特性的支持已经能够覆盖住大型 App 需求了,并且 SPM 不仅仅只跟 Swift 玩,C Family 它均可以支持。
在 SPM 与 Cocoapods 的对比中,亲儿子 SPM 跟 Xcode 深刻整合,Xcode 能够直接打开编辑 swift package,Xcode 由于 SPM 设计了对应的操做界面,下降了开发和使用的门槛。成熟的工具链也让联调 Swift Package 垂手可得。而 Cocoapods 由社区维护,每一次 Xcode 更新其响应也不算很及时,在针对大型 App 时由于 Podfile 与 podspec 的分离致使了许多不一致,使用 ruby 还有必定的门槛。
如今也许是拥抱 SPM 的好时机。
如今官方支持的操做系统列表以下:
真正作到的跨平台,而且 Swift 官方支持 AWS Lambda。AWS Lambda Runtime 已经开源,支持了 AWS 的 FaaS 编程,进一步的拓宽了 Swift 涉足的领域。
调试和开发者体验也是一门语言很是重要的一环,由于没有人会写出没有错误的代码,检查错误的能力和工具对一门语言来讲十分重要。苹果也十分注重这一方面,在开发者体验上下足了功夫。
刚开始使用 Swift 的开发者可能常常会对 Xcode 的报错信息不知所云,在引入 SwiftUI 后,这个问题尤其明显。笔者第一次编写 SwiftUI 时,只要 body
中某个地方出错,报出来的错误都是不正确的,只能经过肉眼检查和推断才能明白本身的错误,十分痛苦。
如今苹果重制了诊断能力,如今 Swift 的错误诊断比以前准确了许多,错误没有乱报而且错误提示也变得很好理解,特别是 SwiftUI,很容易知道错在哪了。在 Swift 中,编译经过就是对正确性的一个很好的证实,除非你用不安全的方式让编译器闭嘴。
通过强化的类型推断系统,也加强了 Swift 的代码补全能力。这个估计升级到 Xcode 12 就能够顺利体验了。同时代码缩进能力也获得了增强。
看了这么多年 WWDC,每次看时你们应该都有一种心态
只支持最新版本,咱们才支持 iOS X (低版本),这些东西跟我不要紧感受 Swift 真香,可是现实只让我使用 OC(叹口气)
什么语言不是用,OC 这么多年确定够用了
然而若是不及时作出改变,保持能用就行,在前进的路上,背上的担子就会愈来愈重。当发现快走不动时,又回过头来看 WWDC,就会发现,原来解决方案好久之前就已经给出来了,只是当时不以为是个问题,这不支持那不合适,可是如今想拿出来使用的时候,面对背上那一团团的乱码,却又一筹莫展。
作出改变是痛苦的,可是当之前以为痒就挠挠就解决了的事情,逐渐变成如今的痛点时,要作出改变也许会更痛苦。
Swift 的出现就是为了替代而且超越 Objective-C 的语言,虽说苹果由于历史缘由还在使用 OC,可是种种迹象代表,苹果正在作积极的工做,逐渐经过 Swift 下降 OC 在整个系统的比重。
社区也在积极的转变,许多著名的第三方库都已经迁移至 Swift,OC 版本已经再也不维护,例如 Lottie 已经在 Swift 版本上出现了 OC 版本不存在的特性,而且 OC 版本再也不维护。这种现象慢慢会愈来愈多。
咱们也在积极探索 Swift 在手淘的落地,取得了 Swift 5.1 能模块在手淘中正确运行起来的阶段性成就。
如今时机已经成熟,语言特性,SPM,工具链,标准库都已经足够强大,是时候作出改变了。
Swift 虽然看起来很简单,但其实它是一种下限低,上限高的语言,集团内部的 Swift 环境,须要你们来一块儿维护。咱们将来也要增强 Swift 语言相关的培训,让开发者真正理解 Swift,上手 Swift,成为一名 Swifter 而不是 OSwifter。
手淘客户端团队正在进行社招招聘,岗位有iOS Android客户端开发工程师等,欢迎推荐。
简历投递:junzhan.yzw@taobao.com
( WWDC 2020精彩内容思否专栏:https://segmentfault.com/blog...
本篇内容来自于阿里巴巴淘系技术部,无线开发工程师星志。 更多精彩内容可关注【淘系技术】公众号。)