正如官方博客所说, Swift 4.2 是为 Swift 5 的 ABI 稳定性做准备, 它包含了一些底层 ABI 的变化. 我们看 swift-evolution 中的 proposal 清单, 在
4.2
中已经实现了其中一些 proposal. 本文主要总结了参考文献中
What's new in Swift 4.2?
的内容, 做个简要的介绍.
因为 Swift 4.2 还没有正式发布, 所以这只是个预览. 正式发布后, 实际内容可能会有不同. 我们将及时跟进.
1 新的 CaseInterable 协议, 枚举类型实现这个协议后, 能自动生成一个包含所有 case 项的数组. 这个操作是在编译时进行的, Swift 会自动合成一个 allCases 属性, 包含枚举的所有 case 项. 默认的属性值不包含枚举关联值, 如果有需求的话, 可以重写 allCases 属性. 另外需要注意的是, 如果有枚举项标记为 unavailable, 则默认无法合成 allCases, 只能依靠自己来手动合成.[SE-0194]
- enum Pasta: CaseIterable {
- case cannelloni, fusilli, linguine, tagliatelle
- }
- for shape in Pasta.allCases {
- print("I like eating \(shape).")
- }
- enum Car: CaseIterable {
- static var allCases: [Car] {
- return [.ford, .toyota, .jaguar, .bmw, .porsche(convertible: false), .porsche(convertible: true)]
- }
- case ford, toyota, jaguar, bmw
- case porsche(convertible: Bool)
- }
- enum Direction: CaseIterable {
- static var allCases: [Direction] {
- return [.north, .south, .east, .west]
- }
- case north, south, east, west
- @available(*, unavailable)
- case all
- }
2 新增 #warning 和 #error 编译指令, 强制 Xcode 在 build 时生成警告或错误信息.[SE-196]
func encrypt(_ string: String, with password: String) -> String {
- #warning("This is terrible method of encryption")
- return password + String(string.reversed()) + password
- }
- struct Configuration {
- var apiKey: String {
- #error("Please enter your API key below then delete this line.")
- return "Enter your key here"
- }
- }
3 新增
@dynamicMemberLookup
和
subscript(dynamicMember:)
方法, 让 Swift 可以以属性访问的方式调用下标操作. 这让我们可以像 Python 一样来访问字典值, 不过是以类型安全的方式. 这个 proposal 还有很多内容, 可以查看相关内容.
- @dynamicMemberLookup
- struct Person {
- subscript(dynamicMember member: String) -> String {
- let properties = ["name": "Taylor Swift", "city": "Nashville"]
- return properties[member, default: ""]
- }
- }
- // 正常运行, 即使 Person 没有声明 name, city, favoriteIceCream 属性
- let person = Person()
- print(person.name)
- print(person.city)
- print(person.favoriteIceCream)
4 增强的条件一致性 (
conditional conformances
): 包括运行时查询条件一致性, 提升自动合成 Hashable 一致性的能力 (一个类型的所有元素如果符合 Hashable 协议, 则类型自动符合 Hashable 协议)
- protocol Purchaseable {
- func buy()
- }
- struct Book: Purchaseable {
- func buy() {
- print("You bought a book")
- }
- }
- extension Array: Purchaseable where Element: Purchaseable {
- func buy() {
- for item in self {
- item.buy()
- }
- }
- }
- let arr: Any = [
- Book(),
- Book()
- ]
- // 下面代码在 4.1 中会崩溃, 而在 4.2 中则不会
- if let books = arr as? Purchaseable {
- books.buy()
- }
5 为集合新增 removeAll(where:) 方法, 高效地执行根据条件删除操作.[SE-0197]
- var pythons = ["John", "Michael", "Graham", "Terry", "Eric", "Terry"]
- pythons.removeAll { $0.hasPrefix("Terry") }
- print(pythons)
6 为 Bool 类型提供新方法 toggle(), 以在 true 和 false 之间进行切换.[SE-0119]
- extension Bool {
- mutating func toggle() {
- self = !self
- }
- }
- var loggedIn = false
loggedIn.toggle()
参考:
Swift evolution https://github.com/apple/swift-evolution
What's new in Swift 4.2? https://www.hackingwithswift.com/articles/77/whats-new-in-swift-4-2
来源: https://juejin.im/post/5ad8b22d6fb9a07ab83d8f43