【问题标题】:Swift keyPath vs protocolSwift keyPath 与协议
【发布时间】:2019-04-29 13:47:24
【问题描述】:
我了解 keyPaths 的基本概念,但我不了解它的用例。如果您已经知道实例的类型,则可以轻松访问它们的属性。如果你不这样做,协议已经支持只读、读写属性。有人可以解释一下我错过了什么吗?除了 keyPaths 或者当 keypaths 比协议更好时,我们不能用协议做什么?
【问题讨论】:
标签:
swift
protocols
swift-protocols
keypaths
【解决方案1】:
如果您已经知道实例的类型,则可以轻松访问它们的属性。如果你不这样做,协议已经支持只读、读写属性。有人可以解释一下我缺少什么吗?
你缺少的是对未知的感觉。
在您的两个句子中,您都谈到知道实例的属性是什么。这不是关键路径解决的问题。关键路径与知道类型无关;他们不反对类型或协议。相反,在您可以使用键路径之前,您必须确切地了解实例的属性是什么。
关键路径用于当未知的是要访问的哪个属性时。它们提供了一种传递属性 reference 的方法,以便其他人可以被告知访问 该 属性。
例如,这是一个 Person 类型:
struct Person {
let firstName : String
let lastName : String
}
这是一个函数,它通过 either firstName 或 lastName 对 Person 数组进行排序,而不知道 哪个排序依据:
func sortArrayOfPersons(_ arr:[Person], by prop: KeyPath<Person, String>) -> [Person] {
return arr.sorted { $0[keyPath:prop] < $1[keyPath:prop] }
}
一个关键路径是你如何告诉这个函数 what 属性用作排序的基础。