【发布时间】:2016-02-14 22:42:44
【问题描述】:
我需要检查一个对象的类是否有一个可用于赋值的成员。假设有一个类:
class MyClass: NSObject {
var myVar : AnyObject!
// ...
}
我尝试了这种 objC 样式,但属性在 Swift 中是不同的野兽,第二行总是返回 false:
let myClass: MyClass = MyClass()
let hasClassMember = myClass.respondsToSelector(Selector("setMyVar:"))
if hasClassMember {
myClass.performSelector("setMyVar:", withObject: "Context" as! AnyObject)
}
我认为 Swift 没有像 ObjC 那样强大的反射,但是有什么解决方案吗?
更新 事实证明我的代码可以工作,但是为了演示目的我已经对其进行了简化。奇怪的是,一旦我将 myVar 的类型更改为某个自定义类的实例,例如 ClassB,responsToSelector 就会停止工作。感觉有点神奇……:)
UPDATE2终于找到了问题所在。还没写完整代码,以为问题出在其他地方,反正这里是完整代码。 MyClass 变量实际上是其他一些实现了 AnotherClassProtocol 的 AnotherClass 的类型
protocol AnotherClassProtocol {
//…
}
class AnotherClass: AnotherClassProtocol {
//…
}
class MyClass: NSObject {
var myVar : AnotherClass!
// ...
}
这导致 myClass.respondsToSelector(Selector("setMyVar:")) 总是返回 false。事实证明,问题是因为我在 AnotherClass 声明中省略了 NSObject 的扩展。在我修复它之后,它开始按预期工作:
class AnotherClass: NSObject, AnotherClassProtocol {
//…
}
我仍在学习 Swift,并认为不需要 NSObject,因为编译器没有抱怨,而且一切都从 NSObject 扩展而来(至少在 ObjC 中)。好吧,我很高兴我发现了这个讨厌的错误。
【问题讨论】:
-
我在操场上尝试了这段代码,它对我来说工作正常。我不得不删除 as! AnyObject 和我还删除了
setMyVar:周围的selector(),因为它不需要。hasClassMember也是基于属性名称的真/假
标签: ios swift reflection