纯Swift类符合协议与静态方法 - 上传问题

Ale*_*ala 13 protocols ios swift

鉴于我们有一个static方法的Swift协议:

protocol Creatable: class {
    static func create() -> AnyObject
}
Run Code Online (Sandbox Code Playgroud)

和一个符合协议的纯Swift类:

class Foo : Creatable {
    static func create() -> AnyObject {
        return Foo() as AnyObject
    }
}
Run Code Online (Sandbox Code Playgroud)

稍后当人们尝试通过操作类型来使用该协议时,Creatable例如:

var f : Creatable = Foo.self
f.create()
Run Code Online (Sandbox Code Playgroud)

编译器抱怨如下:

error: type 'Foo.Type' does not conform to protocol 'Creatable'
Run Code Online (Sandbox Code Playgroud)

问题是:这是一个Swift限制还是我以错误的方式使用协议和静态/类方法.

Objective-C等价物如下:

Class someClass = [Foo class];
if ([someClass conformsToProtocol:@protocol(Creatable)]) {
    [(Class <Foo>)someClass create];
}
Run Code Online (Sandbox Code Playgroud)

Air*_*ity 9

Creatable参考点到一个实例Foo,不以Foo类型本身.

要获得类级协议实现的等效,您需要一个实例Creatable.Type:

let c: Creatable.Type = Foo.self
Run Code Online (Sandbox Code Playgroud)

但是,当您尝试使用它时,您将收到错误:

// error: accessing members of protocol type value 'Creatable.Type' is unimplemented
c.create()
Run Code Online (Sandbox Code Playgroud)

所有这一切,是否有一个原因,你不能只使用函数来满足你的要求,而不是元类型?

let f = Foo.create
// f is now a function, ()->AnyObject, that creates Foos
let someFoo = f()
Run Code Online (Sandbox Code Playgroud)

  • 以下代码应该有效.但是,与您尝试工作的方式相比,可能有更好的方法来解决您的问题,抽象工厂在首先没有良好通用实现和一流功能的语言中更有用.`protocol Creatable {static func create() - > AnyObject}; func create <T:Creatable>(type:T.Type) - > AnyObject {return T.create()}; class S:Creatable {static func create() - > AnyObject {return S()}}; let s =创建(S.self)` (2认同)

Jer*_*rry 6

使用.Type是关键:

var f : Creatable.Type = Foo.self
Run Code Online (Sandbox Code Playgroud)

而且,这不再提供“未实现”错误。请参阅下面的完整代码:

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