WWDC 20 前你應該知道的 Swift 新特性(2):KeyPath 用做函數

Swift 5.2 中新增的另外一個的語言小特性是:KeyPath 用做函數。對於 KeyPath 還不熟悉的同窗能夠先看一下這篇文章:SwiftUI 和 Swift 5.1 新特性(3) Key Path Member Lookupbash

在介紹 KeyPath 的時候咱們介紹過,一個 KeyPath<Root, Value> 的實例定義了從 Root 類型中獲取 Value 類型的方式,它同時能被看做是 (Root) -> Value 類型的一個實例。函數

struct User {
    let name: String
}

users.map{$0.name}
users.map(\.name)
複製代碼

上面的例子中 map 須要一個 (User) -> String 的函數實例,在 Swift 5.2 中,咱們能夠直接傳入 \User.name KeyPath,因爲類型推斷,能夠進一步簡化成\.name。它等價於users.map { $0[keyPath: \.name] }post

然而,非字面值的 KeyPath 是不支持的。ui

let keyPath = \User.name
users.map(keyPath)
複製代碼

上面的代碼會提示編譯錯誤:Cannot convert value of type 'KeyPath<User, String>' to expected argument type '(User) throws -> T'spa

直接傳不行,由於類型不匹配。爲了解決這個問題,能夠顯式地轉換成函數形式。code

let f: (User) -> String  = \.name
let f2 = \.name as (User) -> String
複製代碼

編譯器會生成相似的函數:get

let f: (User) -> String = { kp in { root in root[keyPath: kp] } }(\User.name)
複製代碼

結語

Swift 5.2 中的語言特性介紹完了,讓咱們一塊兒期待 WWDC 20 以及 Swift 5.3 的新特性。編譯器

相關文章
相關標籤/搜索