考虑具有工厂方法的协议:
public protocol Frobnicator {
func frobnicate()
static func makeRightFrobnicator() -> Frobnicator
}
private class SomeFrobnicatorImplementation: Frobnicator { ... }
private class AnotherFrobnicatorImplementation: Frobnicator { ... }
public extension Frobnicator {
static func makeRightFrobnicator() -> Frobnicator {
if something {
return SomeFrobnicatorImplementation()
} else {
return AnotherFrobnicatorImplementation()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在不同的时间构建不同的实现者.实现者本身对模块是私有的,而协议是公共的在客户端代码中使用.
当我尝试类似于上面的代码时,我得到"静态成员makeRightFrobnicator不能用于协议元类型Frobnicator.Protocol."
有没有办法,或者我应该使用免费功能?
静态函数实现是合法的:
protocol P {
static func f() -> P
init()
}
extension P {
static func f() -> P {return self.init()}
}
Run Code Online (Sandbox Code Playgroud)
但你会注意到,为了让它编译,我必须向编译器保证我手头有一种合法的方法来生成 P 以便能够返回一个。
您的代码中的问题是尝试返回协议的特定采用者,例如 SomeFrobnicatorImplementation。协议对于谁采用它是不可知的。换句话说,您无法在协议定义中保证 SomeFrobnicatorImplementation 实际上会成为该协议的采用者。因此,您的那部分代码是非法的。
| 归档时间: |
|
| 查看次数: |
967 次 |
| 最近记录: |