拥有AnyClass类型的变量,是否可以知道该类型是否是另一种类型的扩展或实现?
例如:
var aClass: AnyClass = UIButton.self
// assuming a fictional operator "isOfType"
// Both UIButton and UILabel are subclasses of UIView
aClass isOfType UIButton // true
aClass isOfType UIView // true
aClass isOfType UILabel // false
执行此操作的一种可能方法是创建实例,但可能并不总是需要创建此类实例:
var aClass: AnyClass = UIButton.self
let buttonClass = aClass as? UIButton.Type
var aButton: AnyObject = buttonClass!()
aButton is UIButton // true
aButton is UIView // true
aButton is UILabel // false
还有其他方法可以检查AnyClass是否包含扩展另一种类型的类型吗?
答案 0 :(得分:8)
如果接收类继承自isSubclassOfClass
。
NSObject
let c = UIButton.self
print(c.isSubclassOfClass(UIButton.self)) // true
print(c.isSubclassOfClass(UIView.self)) // true
print(c.isSubclassOfClass(UILabel.self)) // false
更新虽然isSubclassOfClass
中定义了NSObject
,但它似乎可用于不明确派生自NSObject
的Swift类好。以下在Xcode 7 beta 6中的预期效果如此。
class A {
}
class B: A {
}
class C {
}
let c: AnyClass = B.self
print(c.isSubclassOfClass(A.self)) // true
print(c.isSubclassOfClass(B.self)) // true
print(c.isSubclassOfClass(C.self)) // false
我认为,由于兼容性原因,不会从NSObject
继承的Swift类仍然会共享一些方法。但是,我无法找到关于此的任何官方文档,Xcode甚至不让我从上面的代码段导航到isSubclassOfClass
的声明。
更新2:无论类是否继承自NSObject
,否则无论是否将is
与Type
属性一起使用,其他方法都有效。< / p>
let c: AnyClass = UIButton.self
print(c is UIButton.Type) // true
print(c is UIView.Type) // true
print(c is UILabel.Type) // false
let c: AnyClass = B.self
print(c is A.Type) // true
print(c is B.Type) // true
print(c is C.Type) // false