3

我了解 keyPaths 的基本思想,但我不了解它的用例。如果您已经知道实例的类型,则可以轻松访问它们的属性。如果你不这样做,协议已经支持只读、读写属性。有人可以解释一下我错过了什么吗?除了 keyPaths 或者当 keypath 比协议更好时,我们不能用协议做什么?

4

1 回答 1

6

如果您已经知道实例的类型,则可以轻松访问它们的属性。如果你不这样做,协议已经支持只读、读写属性。有人可以解释一下我错过了什么吗?

你缺少的是对未知事物的感觉。

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

关键路径适用于未知要访问哪个属性的情况。它们提供了一种传递属性引用的方法,以便可以告诉其他人访问属性。

例如,这是一个 Person 类型:

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

下面是一个函数,它通过thefirstName the对 Persons 数组进行排序lastName,而不知道按哪个排序:

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

一个关键路径是你如何告诉这个函数使用什么属性作为排序的基础。

于 2019-04-29T15:10:32.217 回答