Swift 5.3的进化:语法、标准库、调试能力大幅提升
Swift 从 5.0 的 ABI 稳定到5.1 的模块稳定,Swift 终于不是《Swift 入门到重学》了。本次 WWDC2020,Swift 5.3 正式发布,Swift 依旧朝着安全、高效、易读的方向持续发力,不断的在改进语法,增强代码的表达能力和易用性。因为 Swift 的模块稳定,SPM 现在也支持了二进制模块的分发,逐渐完善的社区生态也在不断拓宽 Swift 可以涉足的领域,而不仅仅是在 Apple 平台之上。
Swift 发展里程碑
下图展示了 WWDC2020 中 Swift 相关内容的脑图,希望可以帮助大家快速了解。
语言环境的完善和拓展
一门完善编程语言有三个最基本的要素:语法、标准库、调试能力。语法设计决定了语言的编程范式;标准库决定了语言的基本能力;调试能力决定了开发者的体验和语言的稳定性。
苹果在 Swift 的迭代过程中不断的强化这几点,我们可以来看看 Swift 又得到了哪些提升。
语法特性
Swift 的语法设计核心还是 OOP,但是这不妨碍 Swift 的语法在支持 POP 和函数式编程甚至 DSL 得到的强化。Swift 也因为 SDL 特性的加入,开始逐渐的适应声明式编程的方向发展,比如后文提到的 @main 等等。
▐ Multiple trailing closure
这个改进解决了当函数最后几个参数为闭包的情况下,导致的括号嵌套的问题,API 更加简洁也更加具有表达性。SwiftUI 利用这个语言特性,也变得更加简洁易懂。
▐ KeyPath as Function
KeyPath<Target, Value> --隐式转换--> (Target) -> Value
现在 KeyPath 可以当做函数来使用了。这个语法糖解决的问题当我们使用类似 map 一样的函数时,只需要取出对应数据模型中的某一个属性,为此我们不得不写类似 map { $0.property } 的代码,有了这个语法糖,事情就可以简化成了 map(.property)。
▐ Type-based program entry point (@main)
引入了新的修饰符 @main,可以标记在带有 public static func main() 函数实现的所有类型,无论 main 函数时从拓展来得还是继承来的。添加这个特性的意义在与维持声明式的语义,将声明式语义进行到底。YES!
▐ Increase availability of implicit self in closures
以前我们写逃逸闭包时如果捕获了 self,我们需要在跟 self 有关的地方写上 self. 以警示我们注意循环引用。
如果在闭包的捕获列表中显示声明捕获 self,在闭包中对 self 相关的访问可以省略。如果是在不可变的函数中访问,self 可以直接省略(为了 SwiftUI)。
其实这一点改进有用但是覆盖面并不是很广,因为在实际的应用中,我们都是尽量先弱引用 self 后再强引用 self,来保证 self 的可访问性。在如下场景就得不到此项优化:
requestDataAsync { [weak self] in guard let self = self else {return} self.property // ✅ property // ❎ 需要显式声明 self }
▐ Multi-pattern catch clauses
这种写法可以自动实现错误匹配,进入到对应的错误处理中,而不需要使用 switch,增强语言的可读性。
▐ Enum enhancements
自动符合 Comparable
编译器现在可以自动为你生成 Comparable 的相关方法,实现 Enum 的比较。
Enum case 可以用来适配 protocol
这个特性看引用场景需要吧,官方给了一个比较好的例子。具体相关内容可以参考 SE-0280。
▐ DSL 新增对 switch 的支持
现在可以在 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,正式成为一门优秀的跨平台语言。
▐ 标准库更新
Float16 的支持,具有更好的运算性能
Apple Archive 一种功能类似 zip 的压缩文件,苹果就是用这种格式来更新系统
Swift System 对操作系统基础 API 的包装,让 API 更健壮易用
OSLog 推荐使用的 logging system
从这些更新可以看出,苹果对 Swift 的底层操作非常关心,Swift System 的出现让使用 Swift 底层开发者脱离 OS C API 的折磨,获得更一致更健壮的代码体验。
▐ 新的一方库
Numerics 解决 Swift 中数学计算相关问题
ArgumentParser 为 Swift 编写脚本提供了强力的工具
StandardLibraryPreview 预览标准库中的新功能
▐ Code Size and Runtime
在使用 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 底层的不断优化也让其成为一门高效的语言,降低运行时的要求,就可以提升其应用的场景。
▐ Swift Package Manager
SPM 作为 Swift 生态非常重要的一环,也迎来了更新。
SPM 支持二进制包分发
SPM 支持了资源的打包
这两点更新已经表明了 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 的好时机。
▐ 跨平台
现在官方支持的操作系统列表如下:
Apple platform
Ubuntu 16.04, 18.04, 20.04
CentOS 8
Amazon Linux 2
Windows (coming soon)
真正做到的跨平台,并且 Swift 官方支持 AWS Lambda。AWS Lambda Runtime 已经开源,支持了 AWS 的 FaaS 编程,进一步的拓宽了 Swift 涉足的领域。
调试能力(开发者体验)
调试和开发者体验也是一门语言非常重要的一环,因为没有人会写出没有错误的代码,检查错误的能力和工具对一门语言来说十分重要。苹果也十分注重这一方面,在开发者体验上下足了功夫。
▐ 更加智能的诊断信息
刚开始使用 Swift 的开发者可能经常会对 Xcode 的报错信息不知所云,在引入 SwiftUI 后,这个问题尤为明显。笔者第一次编写 SwiftUI 时,只要 body 中某个地方出错,报出来的错误都是不正确的,只能通过肉眼检查和推断才能明白自己的错误,十分痛苦。
现在苹果重制了诊断能力,现在 Swift 的错误诊断比之前准确了许多,错误没有乱报并且错误提示也变得很好理解,特别是 SwiftUI,很容易知道错在哪了。在 Swift 中,编译通过就是对正确性的一个很好的证明,除非你用不安全的方式让编译器闭嘴。
▐ 自动补全
经过强化的类型推断系统,也增强了 Swift 的代码补全能力。这个估计升级到 Xcode 12 就可以顺利体验了。同时代码缩进能力也得到了加强。
▐ LLDB
积极拥抱 Swift
看了这么多年 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。
参考:
SwiftUI 背后那些事儿
WWDC20 What's new in Swift
WWDC19 What's new in Swift
WWDC18 What's new in Swift
WWDC17 What's new in Swift
WWDC16 What's new in Swift
WWDC20 Swift packages: Resources and localization
WWDC20 What's new in SwiftUI
Swift 5 时代的机遇与挑战到底在哪里?
Swift Evolution
手淘客户端团队
淘宝基础平台团队正在进行社招招聘,岗位有iOS Android客户端开发工程师、欢迎 转岗推荐。
简历投递:junzhan.yzw@taobao.com
关注「淘系技术」微信公众号,一个有温度有内容的技术社区~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
通过Serverless技术降低微服务应用资源成本
本文作者:山猎,阿里云智能技术专家,13年IT领域行业经验,对互联网云原生架构以及大规模分布式技术有着深入理解,实战经验丰富,多次帮助阿里云的行业客户对系统架构完成全面的云原生改造。 前言 在大型分布式IT架构领域,微服务是一项必不可少的技术。从本质上来讲,微服务是一种架构风格,将一个大型的系统拆分为多个拥有独立生命周期的应用,应用之间采用轻量级的通信机制进行通信。这些应用都是围绕具体业务进行构建,可以独立部署、独立迭代,也可能根据业务负载独立的水平扩展。微服务思想以及相关的技术为IT架构的发展带来了一系列深刻的变革:1、 易于开发和维护:一个应用只会关注一组特定的业务功能,通过服务拆分,能减少应用之间的耦合度,让开发和维护更加简单。2、 技术栈不受限制:在微服务架构中,可以结合项目业务及团队的特点,合理的选择技术栈。3、 加快系统演进速度:每一个应用都可以独立的进行版本更新,通过灰度发布等技术手段能确保发布过程中整个系统稳定运行。4、 突破性能瓶颈:每个应用都能独立的水平伸缩,使系统性能可以根据计算资源的增加而得到线性的扩展。 微服务的挑战 世上没有免费的午餐,微服务技术让IT系统变...
- 下一篇
Core Image:iOS图像处理技术追踪
Core Image是苹果官方提供的图像处理框架,通过丰富的built-in(内置)或自定义Filter(过滤器)高效处理静态图片、动态图片或视频。开发者还可以通过构造Filter链或自定义Core Image Kernel来实现更丰富的效果。 在WWDC20中,苹果官方针对Core Image技术在以下三方面做了优化:Core Image对视频/动图的支持、基于Metal构建Core Image (CI) Kernel以及Core Image的Debug支持。 这三方面会在下文逐一提到,文末笔者也会浅谈Core Image在手淘图片库中的应用可能以及对Core Image技术的展望。 优化Core Image对视频/动图的支持 ▐ 创建CIContext 创建 CIContext 时,需要遵循一个 view 一个 context 的原则。由于视频的每一帧都会发生变化,将CIContext的cacheIntermediates属性设置为false可以大大减少内存消耗。 如果在使用Core Image时将同时运用Metal(作为输入或输出),通过设置MTLCommandQueue属性创建...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8