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

Swift 检查AnyClass变量是否是类的扩展或实现,swift,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

拥有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是否包含扩展其他类型的类型?

如果接收类继承自
NSObject
,则可以使用
isSubclassOfClass

let c = UIButton.self
print(c.isSubclassOfClass(UIButton.self)) // true
print(c.isSubclassOfClass(UIView.self)) // true
print(c.isSubclassOfClass(UILabel.self)) // false
更新:尽管
isSubclassOfClass
NSObject
中定义了
isSubclassOfClass
,但它似乎也适用于不显式派生自
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
属性

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

整洁,这绝对是有帮助的。我仍然想知道是否有一种方法可以不用NSObject方法,或者直接使用swift类型语法来实现这一点。@LopSae似乎
isSubclassOfClass
也适用于纯swift类(请参阅我的更新)@LopSae我认为将
is
Type
属性一起使用可能是最快捷的方法(请参阅我的第二次更新)。太好了!使用
是Class.Type
看起来是正确的方法。奇怪的是,
是类。self
不起作用,这是我以前尝试过的,而且从来没有想过
类。Type
可以这样使用。@LopSae我同意,这有点不直观。