Swift keyPath与协议

3

我理解keyPaths的基本概念,但我不明白它的应用场景。如果您已经知道实例的类型,可以轻松地访问它们的属性。如果您不知道,协议已经支持只读、读写属性。有人能解释一下我错过了什么吗?有任何协议无法做到但是keyPaths可以,或者keyPaths比协议更好的地方吗?


2
典型的使用案例是KVO - Rob
1个回答

8
如果你已经知道实例的类型,那么可以很容易地访问它们的属性。如果不知道,协议已经支持只读和读写属性。你所缺少的是对未知事物的认识。
在你的两个句子中,你谈到了知道实例的属性是什么。这并不是键路径解决的问题关键。键路径与知道类型无关;它们与类型或协议没有任何形式上的对立。相反,在使用键路径之前,必须确切地知道实例的属性是什么。
当未知的是要访问哪个属性时,键路径就派上用场了。它们提供了一种传递属性引用的方式,以便告诉其他人访问那个属性。
例如,这里有一个Person类型:
struct Person {
    let firstName : String
    let lastName : String
}

下面是一个函数,它可以按照名字或者姓氏Persons数组进行排序,而不需要指定按照哪个属性进行排序:

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

一个关键路径就是告诉这个函数要使用哪个属性作为排序的基础。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接