考虑具有工厂方法的协议:
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() } } }
我希望能够在不同的时间构建不同的实现者.实现者本身对模块是私有的,而协议是公共的在客户端代码中使用.
当我尝试类似于上面的代码时,我得到“静态成员makeRightFrobnicator不能用于协议元类型Frobnicator.Protocol”.
有没有办法,或者我应该使用免费功能?
解决方法
静态函数实现是合法的:
protocol P { static func f() -> P init() } extension P { static func f() -> P {return self.init()} }
但是你会注意到为了让它编译,我必须向编译器保证我手头有一个合法的方法来制作一个P,以便能够返回一个.
代码中的问题是尝试返回协议的特定采用者,例如SomeFrobnicatorImplementation.协议对谁采用它是不可知的.换句话说,您无法在协议定义中保证SomeFrobnicatorImplementation实际上将成为此协议的采用者.因此,您的代码部分是非法的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。