加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 协议是否有可能具有静态工厂方法的默认实现?

发布时间:2020-12-14 04:40:27 所属栏目:百科 来源:网络整理
导读:考虑具有工厂方法的协议: public protocol Frobnicator { func frobnicate() static func makeRightFrobnicator() - Frobnicator}private class SomeFrobnicatorImplementation: Frobnicator { ... }private class AnotherFrobnicatorImplementation: Frobn
考虑具有工厂方法的协议:

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实际上将成为此协议的采用者.因此,您的代码部分是非法的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读