根据参数

时间:2019-04-10 18:14:57

标签: swift keypaths

我得到了以下代码:

class Person {
    let age = 0
}

func createKeyPath() {
    let ageKeyPath = \Person.age // Works
}

func createKeyPath(from: ???) { // What can I place here to make it compile?
    let ageKeyPath = \from.age
}

我有通用类,我需要在通用具体类型(例如Person)上创建键路径,但是我不确定如何基于参数创建键路径。我尝试过:

func createKeyPath(from: Person.Type) {
    let ageKeyPath = \from.age
}

但是它不能编译。

2 个答案:

答案 0 :(得分:1)

这是一个操场示例(基本上,您将需要约束泛型,以便编译器可以确保您要查找的KeyPath实际上存在于该泛型类型上):

import UIKit
import PlaygroundSupport

protocol Ageable {
    var age: Int {get}
}

class Person: Ageable {
    let age = 0
}

func createKeyPath<SomeAgeable: Ageable>(from: SomeAgeable) -> KeyPath<SomeAgeable, Int> {
    return  \SomeAgeable.age
}

let p = Person()
let keyPath = createKeyPath(from: p)
print(p[keyPath: keyPath])

答案 1 :(得分:0)

  

我需要在通用的具体类型(例如Person)上创建键路径,但是我不确定如何基于参数创建键路径。

在处理键路径的方法(例如value(forKeyPath:))中,字符串用作键路径参数。