Swift получить все KeyPath для протокола

В последней версии Swift есть ли способ получить все переменные, определенные протоколом? Представьте, что у меня есть что-то вроде:

protocol Foo {
    var a: Double { get set }
    var b: Double { get set }
}

class SomeClass: Foo {
    var a: Double = 1
    var b: Double = 2
    var c: Int = 3
}

Мне нужен способ взять объект SomeClass и знать, как запрашивать переменные a и b, потому что это две переменные, которые определяет протокол. Например, я могу захотеть суммировать значения всех переменных из протокола. например что-то вроде этого нефункционального кода.

let obj = SomeClass()
let paths = Foo.allKeyPaths
let total = paths.reduce(0) { $0 + obj[keyPath: $1] }

В моем реальном случае использования протокол имеет около 20 переменных. Я не хочу жестко кодировать массив ключей, потому что кто-то может добавить новую переменную в протокол, но, например, забудет обновить этот массив. Я хочу, чтобы он был динамическим во время выполнения.


person Gargoyle    schedule 11.04.2018    source источник
comment
@zombie Это будет работать для протоколов Objective-C, поскольку Objective-C является полностью динамическим языком, но не будет работать для собственных протоколов Swift.   -  person Charles Srstka    schedule 11.04.2018


Ответы (1)


К сожалению, в текущей версии Swift это невозможно.

person Charles Srstka    schedule 11.04.2018