WWDC2018-Swift更新了什麼?

rsenjoyer發表於2018-06-06

更新時間: 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,

官方的圖片顯示

WWDC2018-Swift更新了什麼?

在我實際測試之中, 編譯速度真的提升很多。以前專案完全編譯的情況需要大概10-20多分鐘,這次僅僅花了4分多。而且遷移到 Swift4.2 幾乎沒有任何障礙。

Xcode10 增加了編譯模式(Copilation Mode) 和 優化水平(Optimization Level)

WWDC2018-Swift更新了什麼?

編譯模式(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

WWDC2018-Swift更新了什麼?

語言新特性(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 之前

WWDC2018-Swift更新了什麼?

Swift 4.2 之後, 可以對集合內的元素進行比較

WWDC2018-Swift更新了什麼?

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

WWDC2018-Swift更新了什麼?

WWDC2018-Swift更新了什麼?

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連結

WWDC2018-Swift更新了什麼?

WWDC2018-Swift更新了什麼?

Swift 語言的新特性其實都在 https://apple.github.io/swift-evolution/ 有列出, 開發者可以點選進去檢視原文.

相關文章