Swift 继承了 Objective-C 的元类概念:类本身也被视为对象。一类Foo
的对象的类是Foo.self
,它的类型是Foo.Type
. If Foo
继承自Bar
, then Foo.self
可以分配给类型的变量Bar.Type
, 也。这至少有两个好处:
- 它允许覆盖“静态方法”;
- 以类型安全的方式创建未知类的实例并且不使用反射很容易。
我现在特别关注第二个。为了确保每个人都能理解我的意思,下面是一个例子:
class BaseFoo {
var description: String { return "BaseFoo" }
}
class DerivedFoo: BaseFoo {
override var description: String { return "DerivedFoo" }
}
let fooTypes: [BaseFoo.Type] = [BaseFoo.self, DerivedFoo.self] // metaclass magic!
for type in fooTypes {
let object: BaseFoo = type() // metaclass magic!
println(object)
}
现在,我有一系列AnyClass
对象(任何元类实例都可以分配给AnyClass
,就像任何对象都可以分配给AnyObject
),我想找到哪些实现了给定的协议。该协议将声明一个初始值设定项,我将像上面的示例中一样实例化该类。例如:
protocol Foo {
init(foo: String)
}
class Bar: Foo {
required init(foo: String) { println("Bar initialized with \(foo)") }
}
class Baz {
required init() { println("I'm not a Foo!") }
}
let types: [AnyClass] = [Bar.self, Baz.self]
到目前为止,一切都很好。现在的问题是确定该类是否实现了该协议。由于元类实例是多态的,我希望能够对它们进行强制转换。然而,我显然错过了一些东西,因为 Swift 不允许我写这个:
for type in types {
if let fooType = type as? Foo.Type {
let obj = fooType(foo: "special snowflake string")
}
}
我得到的编译器错误是:
error:“Foo”与“AnyObject”不同
有没有办法确定元类实例是否表示实现协议的类,以及是否有办法将该实例转换为协议类型?
我试图声明Foo
作为一个类协议,但这显然还不够。
EDIT: 我刚刚尝试过Any
类型,虽然它不会导致语法错误,但它会使 Swift 编译器崩溃。