Swift 4.2 отвечает на Selector возвращает false, как проверить, существует ли свойство? - PullRequest
0 голосов
/ 16 января 2019

В следующем примере я ожидаю, что x.responds(to: Selector(name)) вернет true. Однако это не так.

x.value(forKeyPath: name) выдает ошибку signal SIGABRT.

Тот же код работал в Swift 3.

Мой вопрос: как проверить свойства в классе (который выходит из NSObject) и получить их на основе строки.

import UIKit

class Test: NSObject {
    var test = "test"
}

func property(_ object: Any, _ name: String) -> Bool? {
    let x = object as? NSObject

//    x?.value(forKeyPath: name)

    return x?.responds(to: Selector(name))
}

property(Test(), "test")

(код для детской площадки в Swift 4.2)

1 Ответ

0 голосов
/ 16 января 2019

Размещение @objc перед var test исправило проблемы.

import UIKit

class Test: NSObject {
    @objc var test = "test"
}

func property(_ object: Any, _ name: String) -> Bool? {
    let x = object as? NSObject

    x?.value(forKeyPath: name)

    return x?.responds(to: Selector(name))
}

property(Test(), "test")
...