歡迎加入QQ討論群258996829
月之殘骸 頭像
蘋果2袋
2
月之殘骸

Swift 4正式發(fā)布,新功能概覽

發(fā)布時間:2017-10-02 22:41  回復:0  查看:3262   最后回復:2017-10-02 22:41  

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

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

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

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

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

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

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

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 }
Dictionary Set 現(xiàn)在可以篩選成為原始類型的另一個對象,而不再篩選為 Array 。此外字典也已經(jīng)可以支持新的 mapValues 方法:
let catalog4 = catalog.filter { $0.value < 15.0 }
let catalog5 = catalog.mapValues { $0 * 1.2 }
關(guān)于字典還有一個實用的改進:在訪問其元素時可以指定默認值,這樣便可讓下標運算符返回Non-opt類型:
let price1 : Float = catalog['none', default: 0.0]
let price2 : Float? = catalog['none']
Swift 4中所有 Collection 類型均 支持泛型下標(Generic subscript) 。這意味著我們可以定義下列 JSON 結(jié)構(gòu),不將索引的結(jié)果拋給字典:
struct JSON {
    init(dictionary: [String:Any]) {
    ...
    }
    subscript(key: String) -> T? {
    ...
    }
}
let json = ...
let result: String? = json['item']
對于該語言還有一個廣受好評的改進:對歸檔和序列化的支持,以前這需要通過 NSObject NSCoding 處理,無法用于 struct enum 類型。但Swift 4通過 Codable 協(xié)議 增加了對所有類型的序列化支持 。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的遷移助理實現(xiàn)。

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

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

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



您還未登錄,請先登錄

熱門帖子

最新帖子

?