Я не могу заставить цепочку ключ-значение (KVC) работать в Swift для составных путей

Рассмотрим следующий класс, который может быть выполнен в Xcode Playground:

import Foundation
class MyClass : NSObject {

    var stringProperty:String
    var integerProperty:Int
    var linkedInstance:MyClass!

    init(String string:String, Int int:Int) {
        stringProperty = string
        integerProperty = int
    }
}

Следующие строки работают как положено.

var myInstance = MyClass(String: "xxx", Int: 32)
myInstance.valueForKey("stringProperty")
myInstance.setValue(2, forKey: "integerProperty")
myInstance.valueForKey("integerProperty")

var anotherInstance = MyClass(String: "yyy", Int: 33)
myInstance.linkedInstance = anotherInstance
myInstance.linkedInstance.integerProperty = 2

Однако, пытаясь получить доступ к значению с помощью KVC через составной путь,

myInstance.valueForKey("linkedInstance.integerProperty")

Причина ошибки "Выполнение было прервано, сигнал причины SIGABRT." Я не заставлял составные пути работать со Swift, но они хорошо работают в Objective-C. Доза это связано с опциями? Значения для простых путей возвращаются в оболочке.

1 ответ

Как только вы измените эту последнюю строку на

myInstance.valueForKeyPath("linkedInstance.integerProperty")

Ваша игровая площадка будет играть намного лучше с вами.

Урок: не путай valueForKey: с valueForKeyPath:! Выражение valueForKey("linkedInstance.integerProperty") никогда не может преуспеть в Swift или Objective-C, потому что"linkedInstance.integerProperty" это не ключ - это ключевой путь.

Другие вопросы по тегам