iOS开发心得Swift开发实战Swift

WWDC17 - What's New in Swift

2017-06-13  本文已影响874人  Hesse_Huang

官方视频地址:https://developer.apple.com/videos/play/wwdc2017/402/

在这个近1个小时的视频里,我们看到了 Swift 4 的新特性,Swift 团队的方向以及开源社区的强大力量。

整个视频分为五个小节,分别为:

下面我们就逐个解析吧。

一、语言的优化与新功能(Language refinements and additions)

var btns: [UIButton & MyProtocol]

&将类名和协议名组合起来,实现一些特定的能力。增加了POP的可用性,喜大普奔!同时,一些 OC 的 API 终于有了完美的 Swift 写法,如视频中的提及的:

类与协议的组合

二、源码兼容性

Swift 4 的与 Swift 3 的差别不大,至少不像从 Swift 2 到 3 这么大。这下大家可以安心升级到 Swift 4 了吧?

在 Xcode 9 中,Swift 会以 4 和 3.2 两个版本兼容存在。我们可以对不同的 target 选择不同的版本进行编译,比如:App 用 Swift 4 编译,而某些第三方库没有更新,依然可以用 Swift 3.2 来编译。

两个版本兼容存在

三、工具与性能

New Build System 预编译的桥接头文件 万恶的Indexing 无法预见的性能瓶颈

视频中还提到:“我们正在重新考量这个内联缓存区的大小,但在 Swift 4 中,它依然是过去一样占 3 个 Words 的大小”。

COW优化后的存在容器 Swift3会自动加入@objc关键字 迁移代码的最后一步

"静态链接器和动态链接器分别用自己的字典树来快速查找符号,也就是说 Swift 的 symbols 放在符号表中是基本上没用的。"

因此在 Xcode 9 中,Strip Swift Symbols 默认开启以优化我们工程中自己的 Swift 代码;而对于系统库的 Swift 代码,则在 App Thinning 中才进行符号剥离,同样有一个Strip Swift Symbols的选项可供勾选。

优化后的系统库大小对比 工程中开启 Symbol Stripping 导出时的 Symbol Stripping 选项

四、标准库

这一小节主要讲了Swift 字符串的优化、一些新语法和新的泛型特性。

String 的 zipping 三双引

五、内存的排他性存取(Exclusive access to memory)

这是一个 Swift 4 的新特性,简单而言就是,对有值语义(value types)集合类型变量的写操作时,不能同时再触发另一读写操作。或者也可以理解成,不能再触发 copy-on-write 机制。

内存的排他性存取

也就是说,不让下面这种事发生!在迭代时,闭包引用了numbers的缓存区,希望修改numbers内元素的值。如果此时执行numbers = [],那就会报错:排他性存取!

非排他时触发了COW

排他性存取的检测分为编译时运行时两种。编译时检测可直接报错;运行时检测则会抛出异常,如下图。

运行时报错

有点像多线程的问题对吧?至此,我们只是在单线程下看这个排他性存取,而如果在多线程下触发运行时的排他性存取,那就要通过 Thread Sanitizer 处理了。

当前,在 Swift 3.2 下的非排他性存取只会报 warning,但在未来的 Xcode 中会升级为 error。

内存的排他性存取保证了安全性的同时,也为从中优化了标准库的设计。

在工程设置中可以调整 Exclusive Access to Memory 的策略。

WX20170613-211406@2x.png

总结

Swift 4 在 Swift 3 的基础上升级,没有像去年那样巨大的迁移成本。升级后的 Swift 更快速、更安全,配合着 Xcode 9,生成的 App 体积将更小。

最后

此文粗略,或有错漏,烦请指明,当天修正!

终于写完了!全程无字幕听着画重点,哈哈!🐶
Let's Swift!🎉

上一篇 下一篇

猜你喜欢

热点阅读