检查AnyClass变量是否是类的扩展或实现

时间:2015-09-05 18:03:11

标签: swift

拥有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是否包含扩展另一种类型的类型吗?

1 个答案:

答案 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,否则无论是否将isType属性一起使用,其他方法都有效。< / 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