WWDC2018-Swift更新了什么?

2,166 阅读3分钟

更新时间: 2018-6-6

WWDC2018 在昨天(6.5)凌晨开幕了, 本次大会主要针对 iOS、macOS、tvOS、watchOS 平台。作为开发者, 第一时间关注的是技术的更新。 昨天就升级到 iOS12 以及在 Mojave 上使用 Xcode10。 这段时间会陆陆续续更新。 这篇文章是关于昨晚的 What's new in Swift

值得一说: Swift5 得等2019年咯

Faster Swift Debug Builds

Xcode10 给人的第一印象就是 Build Faster,

官方的图片显示

在我实际测试之中, 编译速度真的提升很多。以前项目完全编译的情况需要大概10-20多分钟,这次仅仅花了4分多。而且迁移到 Swift4.2 几乎没有任何障碍。

Xcode10 增加了编译模式(Copilation Mode) 和 优化水平(Optimization Level)

编译模式(Copilation Mode):

  • 增量更新(Incremental)
  • 全量更新(Whole Module)

优化水平(Optimization Level):

  • No optimization[-Onone]
  • Optimize for Speed[-O]
  • Optimize for Size[-Osize]

值得提一下的是: 如果你的 Optimization Level 设置为 Optimize for Size[-Osize], 代码体积减少10%~30%, 这样的代价就是 运行时性能降低5%左右

Small String

字符串的大小将变得更小小了, 在64位机器上, 字符串的编码使用16 bytes

语言新特性(New Language Features)

Swift 每个版本的新特性, 开发者可以通过 Github 或者 Swift Evolution 查看

1. 枚举集合(Derived Collection of Enum Cases)

Github链接

Swift Evolution链接

在 Swift4.2之前, 我们遍历枚举值需要这样做


enum Gait {
    case walk
    case trot
    case canter
    case gallop
    
    // 定义一个集合来存储所有的情况
    static var allCases: [Gait] = [.walk, .trot, .canter, .gallop]
}

for gait in Gait.allCases {
    print(gait)
}

如果我们添加、删除或者修改了一个 case, 就需要在 allCases 进行对应的操作, 很麻烦。

Swift 4.2 新增了 CaseIterable 可以实现 allCases 效果。

enum Gait: CaseIterable {
    case walk
    case trot
    case canter
    case gallop
}

for gait in Gait.allCases {
    print(gait)
}

延伸阅读: Handling Future Enum Cases

2. 条件一致性(Conditional conformances)

Github链接

Swift Evolution链接

在 Swift 4.2 之前

Swift 4.2 之后, 可以对集合内的元素进行比较

let coins = [[1, 2], [3, 6], [4, 12]]
        
coins.contains([3, 6]) // true

官方视频中列出了这几种情况:

// Equatable
extension Optional: Equatable where Wrapped: Equatable {}
extension Array: Equatable where Element: Equatable {}
extension Dictionary: Equatable where Dictionary: Equatable {}

// Hashable
extension Optional: Hashable where Wrapped: Hashable {}
extension Array: Hashable where Element: Hashable {}
extension Dictionary: Hashable where Dictionary: Hashable {}

// Encodable
extension Optional: Encodable where Wrapped: Encodable {}
extension Array: Encodable where Element: Encodable {}
extension Dictionary: Encodable where Dictionary: Encodable {}

// Decodable
extension Optional: Decodable where Wrapped: Decodable {}
extension Array: Decodable where Element: Decodable {}
extension Dictionary: Decodable where Dictionary: Decodable {}

还有一个比较有意思的情况是: 条件一致性允许组合(Conditional conformances allow composition)

 //	 Int is Hashable
 //  => Int? is Hashable
 //  => [Int?] is Hashable 

3. Syntheszed Equatable and Hashable

Github链接 Swift Evolution链接

这个新特性是在 Swift 4.1中实现的。

在 Swift4.1 之前, 如果要比较两个对象, 最简单的方式是遵循 Equatable 协议, 然后实现协议定义的方法.


struct Person: Equatable {
    var name: String
    var age: Int
}

func == (lhs: Person, rhs: Person) -> Bool {
    return lhs.name == rhs.name && lhs.age == rhs.age
}

实际上 func == (lhs: Person, rhs: Person) -> Bool {} 在不同对象中, 都需要来实现。

在 Swift 4.1 之后,如果对象 存储型的属性 都是 Equatable, 并且 对象是 Equatable, 系统默认会为你实现 func == (lhs: Person, rhs: Person) -> Bool {} 这个方法, 对象属性进行一个个比较。

这种操作对 Hashable 也是合适的。 如果你的存储型属性是 Hashable, 系统会默认为你实现 public var hashValue: Int { get }

struct Person: Equatable, Hashable {
    var name: String
    var age: Int
}

let p1 = Person(name: "xiaoming", age: 12)
let p2 = Person(name: "xiaoming", age: 12)
let p3 = Person(name: "xiaohong", age: 12)
let p4 = Person(name: "xiaoming", age: 15)

print(p1 == p2) // true
print(p1 == p3) // false
print(p3 == p4) // false

print(p1.hashValue == p2.hashValue) // true
print(p1.hashValue == p3.hashValue) // false
print(p3.hashValue == p4.hashValue) // false

print(p1.name.hashValue == p2.name.hashValue) // true
print(p1.age.hashValue == p3.age.hashValue) // true
print(p1.name.hashValue == p4.name.hashValue) // true


4. 散列增强(Hashable Enhancements)

Github链接 Swift Evolution链接

Hashable 协议新增了一个方法

public protocol Hashable : Equatable {

    public var hashValue: Int { get }

    public func hash(into hasher: inout Hasher)
}

5.Random Number Generation

Github链接 [Swift Evolution链接]( https://apple.github.io/swift-evolution/#?search=0202

6.Adding a build configuration INport Test

Github链接 Swift Evolution链接

7.Target environment platform condition

Github链接 Swift Evolution链接

8. Implicitly Unwrapped Optionals

swift.org/blog/iuo/

9. Enforcing Exclusive Access to Memory

Github链接 Swift Evolution链接

Swift 语言的新特性其实都在 https://apple.github.io/swift-evolution/ 有列出, 开发者可以点击进去查看原文.