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

Lop*_*Sae 5 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
Run Code Online (Sandbox Code Playgroud)

一种可能的方法是创建一个实例,但创建这样的实例可能并不总是令人满意的:

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
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以检查AnyClass是否包含扩展另一种类型的类型吗?

hen*_*nes 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
Run Code Online (Sandbox Code Playgroud)

更新:虽然isSubclassOfClass已定义NSObject,但它似乎可用于未明确派生的Swift类NSObject.以下在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
Run Code Online (Sandbox Code Playgroud)

我相信,NSObject由于兼容性原因,不继承的Swift类仍然会共享一些方法.但是,我找不到任何关于此的官方文档,Xcode甚至不会让我导航到isSubclassOfClass上面代码片段的声明.

更新2:无论类是否继承,NSObject都可以使用的替代方法是isType属性一起使用.

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
Run Code Online (Sandbox Code Playgroud)