Создать ключевой путь на основе параметра - PullRequest
0 голосов
/ 10 апреля 2019

Я получил этот код:

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 ]

1 голос
/ 10 апреля 2019

Вот пример игровой площадки (в основном вам нужно ограничить универсальный тип, чтобы компилятор мог быть уверен, что искомый 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])
0 голосов
/ 10 апреля 2019

Мне нужно создать ключевые пути для общего конкретного типа (например, Person), но я не уверен, как я могу создавать ключевые пути на основе параметра.

Строка используется для параметра keypath в методах, которые обрабатывают keypaths, например, value(forKeyPath:).

...