Мне нужно проверить, имеет ли класс объекта член, который можно использовать для назначения значения. Скажем, есть класс:Как проверить, хранится ли у объекта свойство?
class MyClass: NSObject {
var myVar : AnyObject!
// ...
}
Я попробовал этот стиль ObjC но свойства другой зверь в Swift и вторая линия всегда возвращает ложь:
let myClass: MyClass = MyClass()
let hasClassMember = myClass.respondsToSelector(Selector("setMyVar:"))
if hasClassMember {
myClass.performSelector("setMyVar:", withObject: "Context" as! AnyObject)
}
Я предполагаю, что Swift не имеет мощное отражение как ObjC имеет, но есть ли какое-либо решение?
UPDATE Оказалось, что мой код работает, однако я упростил его для демонстрационных целей. Странная часть реагируетToSelector перестает работать, как только я изменяю тип myVar как экземпляр некоторого пользовательского класса, пусть ClassB. Чувствует себя немного волшебным ... :)
UPDATE2 И, наконец, я нашел проблему. Я не написал полный код, думал, что проблема в другом месте, так или иначе, вот полный код. переменная MyClass фактически является типом некоторой другой AnotherClass, который реализует AnotherClassProtocol
protocol AnotherClassProtocol {
//…
}
class AnotherClass: AnotherClassProtocol {
//…
}
class MyClass: NSObject {
var myVar : AnotherClass!
// ...
}
Это вызывает myClass.respondsToSelector (Selector ("setMyVar:")) всегда возвращает ложь. Оказывается, проблема была в том, что я пропустил расширение NSObject в своей декларации AnotherClass. Он начинает работать, как ожидается, после того, как я установил, что:
class AnotherClass: NSObject, AnotherClassProtocol {
//…
}
Я все еще учусь Свифт и подумал NSObject не нужен, поскольку компилятор не жаловался и все простираются от NSObject в любом случае (по крайней мере, в ObjC). Ну, я рад, что нашел эту неприятную ошибку.
Я попробовал этот код на детской площадке, и он работал правильно для меня. Я должен был удалить это! AnyObject и я также удаляю 'selector()' вокруг 'setMyVar:', поскольку он не нужен. 'hasClassMember' также был true/false на основе имени свойства – Paulw11