Swift:在协议扩展中提供默认协议实现

Swift:在协议扩展中提供默认协议实现,swift,protocols,Swift,Protocols,我正在尝试使用Swift、协议和协议扩展。具体来说,我试图在协议扩展中提供协议的默认实现。这是我的代码: protocol Proto : class { func someMethod() -> String } extension Proto { static func create() -> Self { return ProtoDefaultImpl() as! Self } } class ProtoDefaultImpl : P

我正在尝试使用Swift、协议和协议扩展。具体来说,我试图在协议扩展中提供协议的默认实现。这是我的代码:

protocol Proto : class {
    func someMethod() -> String
}

extension Proto {
    static func create() -> Self {
        return ProtoDefaultImpl() as! Self
    }
}

class ProtoDefaultImpl : Proto {
    func someMethod() -> String {
        return "doing something"
    }
}

let instance = Proto.create()
let output = instance.someMethod()

print(output)
编译器在我调用
Proto.create()
的那一行中抱怨,错误如下:
静态成员“create”不能用于类型为“Proto.Protocol”的实例上。

我错过什么了吗?你有没有办法做到这一点


谢谢。

您不能在协议本身上调用该方法,必须在实现该协议的类型上调用它。这不会改变,因为在扩展中有协议的默认实现。将您的类型从
Proto
更改为
ProtoDefaultImpl
,它将按照您的预期工作

protocol Proto : class {
    func someMethod() -> String
}

extension Proto {
    static func create() -> Self {
        return ProtoDefaultImpl() as! Self
    }
}

class ProtoDefaultImpl : Proto {
    func someMethod() -> String {
        return "doing something"
    }
}

let instance = ProtoDefaultImpl.create()
let output = instance.someMethod()

print(output)

这将输出:
做某事

是的,这很有效。我想探讨的是,Proto的用户是否有某种方法可以生成一个实现Proto的对象,而不知道要实例化哪个具体实现。也许某种生产原型实现的工厂更合适?无论如何,谢谢你的回答!