Swift关键字 Open Source + Growing Ecosystem
Language refinements and additions
Access Control
"private": 作用域变为可在"extension"中访问
Composing Classes and Protocols
"class"和"protocol"可以组合起来使用
protocol Shakeable {
func shake()
}
extension UIButton: Shakeable { /* … */ }
extension UISlider: Shakeable { /* … */ }
func shakeEm(controls: [UIControl & Shakeable]) {
for control in controls where control.state.isEnabled {
control.shake()
}
}
Reference
Section What's New in Foundation
- SE-0161 Smart KeyPaths: Better Key-Value Coding for Swift
- SE-0166 Swift Archival & Serialization
- SE-0167 Swift Encoders
Source compatibility
Swift 4 largely source-compatible with Swift 3
这次总算是向前兼容Swfit 3了: Swift 3 和 Swift 4可以共存在同一个项目中
可以对Target单独设定Swift的版本,但是对我们这种只有单独Target的产品而言,还是只能支持一种啊?
Tools and performance
Build Improvements
新的编译系统提供更快的编译速度,特别是对于大的项目
"Precompiled Bridging Headers": 在OC/Swift混合代码中桥接头文件会很慢,使用预编译可以有效的加快编译时间
"Shared Build for Coverage Testing": XCode9不再需要重新编译
"Indexing While Building": 避免"Background indexing"的重复工作,在编译的过程中直接更新"index"
Predictable Performance
"COW Existential Buffers": Copy-On-Write,只有在修改时才拷贝,避免昂贵的堆Heap
分配消耗
"Faster Generic Code": 在使用泛型Generic
时,用Stack
取代Heap
进行栈分配
Smaller Binaries
Swift 4 会自动移除未被使用的代码
"Limited @objec Inference"
- Swift 3会自动给继承自
NSObject
的非私有的类和成员自动加上@objc
,而Swift 4只有在确定需要的时候才被加入 - 对于不可再OC中表达的代码自动报错
- "Migrator"不能够确认所有需要加
@objc
的方法,但是对于可以确定的,会通过"Warning"的形式报"deprecated"提醒,然后我们再手动的添加 - 迁移完成后可将"Swift 3 @objec Inference"设置改为"Default"
"Symbol Size"
- Swift symbols在symbol table极少使用,在新的配置中自动删除
Standard library
Swift Strings
Swift: A Character is a grapheme
- Swift 4中对字符处理更快:拉丁文、汉字符、片假名
- Swift 3 一个
strings
"包含"一个字符集合 - Swift 4 一个
strings
"就是"一个字符集合
"Simpler one-sided Slicing Syntax"
- 简化范围运算符为单向
"Substrings"
- 区分
Substrings
和Strings
为不同的类型,避免在仅有Substrings
存在的情况下占用过多内存 -
Substrings
可以当做Strings
来使用,享有相同的方法
"Multi-line String Literals"
- 优化了多行字符串的书写
- Swift 3 需要使用换行符
- Swift 4 直接书写,编译器会自动去除格式"\t\t"
New Generics Features
where closure in the associatetype
- 限定
asociatetype
Generic Subscript
-
Subscript
可以使用泛型,包括Return Type
和Subscript Type
Exclusive access to memory
Non-Exclusive Access to Memory
无法控制混乱的访问,以及可能导致的性能问题
Enforcing Exclusive Access to Memory
Swift 4只允许同时读操作
Run-time Enforcement
- 编译阶段不一定知道是否引用同一个实体,可以通过运行时报错
- Global variables
- Properties of classes
- Local variables captured in escaping closures
Multi-threaded Enforcement
- 默认的审查无法在多线程情况下工作
- Default enforcement only catches single-threaded bugs
- Thread Sanitizer catches multi-threaded bugs (其它的演讲)
设置
- Compile-time enforcement: 默认打开
- Run-time enforcement: 默认关闭
网友评论