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