Swift keyPath与协议

时间:2019-04-29 13:47:25

标签: swift protocols swift-protocols keypaths

我了解keyPaths的基本概念,但不了解其用例。如果您已经知道实例的类型,则可以轻松访问其属性。如果您不这样做,则协议已经支持只读,读写属性。有人可以向我解释我所缺少的吗?除了keyPath或密钥路径比协议更好时,我们无法使用协议做任何事情?

1 个答案:

答案 0 :(得分:5)

  

如果您已经知道实例的类型,则可以轻松访问其属性。如果您不这样做,则协议已经支持只读,读写属性。有人可以向我解释我所缺少的吗?

您所缺少的是一种未知的感觉。

在您的两个句子中,您都说知道实例的属性是什么。这不是关键路径解决的问题。关键路径与知道类型无关。它们不反对类型或协议。相反,在使用键路径之前,您必须确切地 知道实例的属性是什么。

关键路径用于何时访问哪个属性。它们提供了一种传递属性 reference 的方法,以便可以告诉其他人访问那个属性。

例如,这是一个Person类型:

struct Person {
    let firstName : String
    let lastName : String
}

这是一个函数,它根据 firstName lastName排序人的数组,而不知道哪个排序依据:

func sortArrayOfPersons(_ arr:[Person], by prop: KeyPath<Person, String>) -> [Person] {
    return arr.sorted { $0[keyPath:prop] < $1[keyPath:prop] }
}

关键路径是如何告诉此函数什么属性用作排序的基础。