Swift 4正式發布,新功能概覽">Swift 4正式發布,新功能概覽

分類:IT技術 時間:2017-09-25

Swift最新的主要版本提供了針對語言本身以及標準庫的大量改動和更新,最重要的變化包括新增的 String 功能、擴展集合、歸檔和序列化等。

Swift 4中, String已全面遵循Collection協議 ,因此可直接叠代並提供了集合與序列類似的全部條件,例如:

for c in myString {
  print(c)
}
myString.filter { c in
  return boolCheck(c)
}
let l = myString.count
let myString2 = myString.dropFirst()

此外String切片現已成為 下標(Substring)類型的實例 ,遵循 StringProtocol ,可按照與 String 類型完全一致的方式使用。這一改動有助於改善切片性能,因為 Substring 已經不再需要復制String切片。復制操作可延遲至 Substring 轉換為 String 並被某些API使用的時候進行。

String的其他功能還包括:支持Unicode 9以及 多行Literal 。

Swift 4還改進了用戶創建、使用和管理集合類型的方式,例如 Dictionary和Set 。

首先,用戶現在已經可以通過元祖(Tuple)序列創建字典,並指定如果遇到重復內容後的處理方式,而這一操作可在創建字典或合並兩個字典的過程中進行:

let items = ["ItemA", "ItemB", "ItemC", "ItemA"]
let prices = [14.40, 41.63, 3.71, 15.63]
let catalog1 = Dictionary(uniqueKeysWithValues: zip(items, prices))
let catalog2 = Dictionary(prices, uniquingKeysWith: { (l, r) in
    l })
let catalog3 = Dictionary(prices, uniquingKeysWith: { (l, r) in
    l + r })
let merged = catalog.merge(catalog3) { (l, r) in r }

DictionarySet 現在可以篩選成為原始類型的另一個對象,而不再篩選為 Array 。此外字典也已經可以支持新的 mapValues 方法:

let catalog4 = catalog.filter { $0.value < 15.0 }
let catalog5 = catalog.mapValues { $0 * 1.2 }

關於字典還有一個實用的改進:在訪問其元素時可以指定默認值,這樣便可讓下標運算符返回Non-opt類型:

let price1 : Float = catalog['none', default: 0.0]
let price2 : Float? = catalog['none']

Swift 4中所有 Collection 類型均 支持泛型下標(Generic subscript) 。這意味著我們可以定義下列 JSON 結構,不將索引的結果拋給字典:

struct JSON {
    init(dictionary: [String:Any]) {
    ...
    }
    subscript

 (key: String) -> T? {
    ...
    }
}
let json = ...
let result: String? = json['item']

對於該語言還有一個廣受好評的改進:對歸檔和序列化的支持,以前這需要通過 NSObjectNSCoding 處理,無法用於 structenum 類型。但Swift 4通過 Codable 協議 增加了對所有類型的序列化支持 。Ole Begemann對Swift 4的 編碼和解碼 提供了入門簡介。例如我們可以這樣定義一個 Codable 類型:

struct Card: Codable, Equatable {
    enum Suit: String, Codable {
        case clubs, spades, hearts, diamonds
    }
    enum Rank: Int, Codable {
        case two = 2, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace
    }
    var suit: Suit
    var rank: Rank
    static func ==(lhs: Card, rhs: Card) -> Bool {
        return lhs.suit == rhs.suit && lhs.rank == rhs.rank
    }
}
let hand = [Card(suit: .clubs, rank: .ace), Card(suit: .hearts, rank: .queen)]

最後,Swift 4提供了兩種語言模式,可通過 -swift-version 編譯器選項進行選擇。在Swift 3.2模式中,編譯器可接受大部分使用Swift 3.x編譯器編譯的源代碼。在該模式下,大部分Swift 4語言功能均可用,但針對之前已有API的各種更新均不可用。在Swift 4.0模式中,我們可以使用Swift 4的全部功能,但可能需要改動部分源代碼,這一過程通常可通過Xcode的遷移助理實現。

Swift 4還有很多改進,建議閱讀Swift維護者Ted Kremenek的公告,並通過Ole Begemann在交互式Playground中提供的所有新功能演示來體驗。

Swift 4已包含在 Xcode 9 中,並可手工安裝到 Xcode 8.3 中使用。

閱讀英文原文: Swift 4 is Officially Available: What's New


Tags: String Dictionary let 切片 myString Swift

文章來源:


ads
ads

相關文章
ads

相關文章

ad