【问题标题】:Swift keyPath vs protocolSwift keyPath 与协议
【发布时间】:2019-04-29 13:47:24
【问题描述】:

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

【问题讨论】:

  • 典型用例是KVO

标签: 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 属性用作排序的基础。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多