整理译自: What's New in Swift 4.1 https://www.raywenderlich.com/187826/whats-new-in-swift-4-1
语言特性提升
条件一致性 (Conditional Conformance https://swift.org/blog/conditional-conformance/ )
Equatable Containers: 当可选型, 数组, 字典等集合与容器类型中的元素遵循 Equatable 或 Hashable 协议, 则其同样遵循这些协议. 包括 Codable 协议.
自定义容器或集合同样可应用泛型配置支持该特性
- // Swfit 4.0
- // [String] to [Int?]
- let a = ["1","2","x"].map(Int.init)
- a == [1,2,nil] // 期待值应该是'true', 但是~!
编译器报错:
- //Binary operator '==' cannot be applied to two '[Int?]' operands.
- --------------------------------------
- // Swift 4.1 新增特性默认实现
- extension Array: Equatable where Element: Equatable {
- // implementation of == for Array
- }
- extension Optional: Equatable where Wrapped: Equatable {
- // implementation of == for Optional
- }
- a == [1, 2, nil] // true
- a.contains(nil) // true
- [[1, 2], [3, 4], []].index(of: []) // 2
JSON Coder 支持驼峰命名与下划线命名转换
- .keyEncodingStrategy
- .keyDecodingStrategy
Equatable 和 Hashable 的一致性:
对所有属性都遵循 Equatable 或 Hashable 的 struct 和 enum 默认遵循该协议.
注意! class 类型不支持这个特性.
Comparable 协议? 继续按业务逻辑自行实现吧.
协议中的关联类型支持递归约束
- protocol Phone {
- associatedtype Version
- associatedtype SmartPhone: Phone where SmartPhone.Version == Version, SmartPhone.SmartPhone == SmartPhone
- }
协议中使用 weak 与 unowned 修饰属性将收到编译警告 (因为在协议中修饰其没有意义)
- class Key {}
- class Pitch {}
- protocol Tune {
- unowned var key: Key { get set }
- weak var pitch: Pitch? { get set }
- }
- class Instrument: Tune {
- var key: Key
- var pitch: Pitch?
- init(key: Key, pitch: Pitch?) {
- self.key = key
- self.pitch = pitch
- }
- }
typeOfCollection(_:) 方法中, IndexDistance 改为 Int
flatMap(_:) 重命名为 compactMap(_:)
平台配置与编译参数更新
编译时导入 (Build Imports)
- // Swift 4.0#
- if os(iOS) || os(tvOS)
- import UIKit
- print("UIKit is available on this platform.")
- #else
- print("UIKit is not available on this platform.")
- #endif
- // Swift 4.1
- #if canImport(UIKit)
- print("UIKit is available if this is printed!")
- #endif
编译时判断目标环境 (Target Environments)
- // Swift 4.0
- #if (arch(i386) || arch(x86_64)) && (os(iOS) || os(tvOS) || os(watchOS))
- print("Testing in the simulator.")
- #else
- print("Testing on the device.")
- #endif
- // Swift 4.1
- #if targetEnvironment(simulator)
- print("Testing in the simulator.")
- #endif
安装掘金浏览器插件
来源: https://juejin.im/post/5ac64ce8f265da23a049cc1d