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

4

我想要尝试一下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'不能用于'type 'Proto.Protocol'的实例'
我错过了什么吗?你有什么办法可以解决这个问题吗?
谢谢。
1个回答

11

你不能在协议本身上调用该方法,你必须在实现该协议的类型上调用它。即使在扩展中有一个协议的默认实现,这也不会改变。将你的类型从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)

这会输出:做某事


2
是的,那个方法可行。我想探索的是,Proto的用户是否有办法生成一个实现Proto的对象,而不知道要实例化哪个具体实现。也许某种生产Proto实现的工厂会更合适?无论如何,感谢您的回答! - vrutberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接