鉴于我们有一个使用static
方法的Swift协议:
protocol Creatable: class {
static func create() -> AnyObject
}
和一个符合协议的纯Swift类:
class Foo : Creatable {
static func create() -> AnyObject {
return Foo() as AnyObject
}
}
稍后当人们尝试通过操作类型Creatable
来使用该协议时,例如:
var f : Creatable = Foo.self
f.create()
编译器抱怨如下:
error: type 'Foo.Type' does not conform to protocol 'Creatable'
问题是:这是Swift限制还是我以错误的方式使用协议和静态/类方法。
Objective-C等价物将是:
Class someClass = [Foo class];
if ([someClass conformsToProtocol:@protocol(Creatable)]) {
[(Class <Foo>)someClass create];
}
答案 0 :(得分:9)
Creatable
引用指向Foo
的实例,而不是Foo
类型本身。
要获得类级协议实现的等价物,您需要Creatable.Type
的实例:
let c: Creatable.Type = Foo.self
但是,当您尝试使用它时会出现错误:
// error: accessing members of protocol type value 'Creatable.Type' is unimplemented
c.create()
所有这一切,是否有理由不仅仅使用函数来满足您的需求而不是元类型?
let f = Foo.create
// f is now a function, ()->AnyObject, that creates Foos
let someFoo = f()
答案 1 :(得分:4)
使用.Type
是关键:
var f : Creatable.Type = Foo.self
这不再给出“未实现”的错误。请参阅以下完整代码:
protocol Creatable: class {
static func create() -> AnyObject
}
class Foo : Creatable {
static func create() -> AnyObject {
return Foo() as AnyObject
}
}
var f : Creatable.Type = Foo.self
f.create()