Swift 键路径(Key Path)的讲解和代码演示

28 min read

Swift中的键路径(Key Path)提供了一种便捷的方式来访问嵌套的属性值。使用键路径可以将一系列属性访问操作组合在一起,而不需要手动进行多次访问。

例如,假设我们有如下的结构体:

struct Person {
   var name: String
   var address: Address

   struct Address {
       var street: String
       var city: String
   }
}

获取该结构体中的属性值可以通过以下方式进行访问:

let person = Person(name: "John", address: Person.Address(street: "123 Main St", city: "Anytown"))
let name = person.name
let street = person.address.street
let city = person.address.city

使用键路径,可以将这些访问操作组合在一起,形成一个更简洁的代码:

let namePath = \Person.name
let streetPath = \Person.address.street
let cityPath = \Person.address.city

let name = person[keyPath: namePath]
let street = person[keyPath: streetPath]
let city = person[keyPath: cityPath]

注意到我们定义了三个键路径变量,分别代表了访问namestreetcity属性的路径。然后,我们可以使用keyPath属性访问Person结构体中的这些属性,并得到相应的值。

除了访问嵌套属性以外,键路径还可以用于访问和修改数组或字典中的元素。例如,假设我们有如下的字典:

var scores = ["John": 90, "Alice": 85, "Bob": 95]

我们可以使用键路径访问和修改该字典中的元素,如下所示:

let johnScorePath = \[String: Int\].self.appending(path: \.["John"])
let johnScore = scores[keyPath: johnScorePath] // 90

let aliceScorePath = \[String: Int\].self.appending(path: \.["Alice"])
let bobScorePath = \[String: Int\].self.appending(path: \.["Bob"])

scores[keyPath: aliceScorePath] = 88
scores[keyPath: bobScorePath] += 5

上面代码定义了两个键路径变量,分别代表了访问字典中John、Alice和Bob对应的值。使用这些变量可以访问和修改相应的元素。

总的来说,Swift的键路径提供了一种简洁和类型安全的方式来访问属性和数组/字典元素,避免了手动进行多次访问的问题,做到了简化代码和提升代码可读性的效果。