【问题标题】:Initializers in protocols in Swift must be designated. Why is that so?必须指定 Swift 协议中的初始化程序。为什么呢?
【发布时间】:2015-01-09 07:32:30
【问题描述】:

如果你尝试在 Swift 中创建一个包含convenience initialiserprotocol,你会立即被编译器骂:

protocol Zizo{
    convenience init(a:String, b:Int)
}

非类类型中不允许使用便利初始化器。

这个限制有什么原因吗?这对我来说没有意义。

可能会出什么问题?

【问题讨论】:

    标签: swift compiler-errors initialization protocols


    【解决方案1】:

    如果您仍然想这样做,您可以考虑在协议中放置一个静态函数:

    protocol Zizo {
         static func make(withA a: String, b: Int) -> Self
    }
    

    当在类继承树中使用时,这确实有点麻烦。

    【讨论】:

      【解决方案2】:

      这是因为,它没有任何意义。 protocol 仅定义实现者具有所需的方法和属性。它没有定义实现细节。当protocol 需要init(a:String, b:Int) 时,您可以根据需要将其实现为指定初始化程序或便利初始化程序。

      protocol Zizo{
          init(a:String, b:Int)
      }
      
      class Foo:Zizo {
          init() {
          }
          convenience required init(a:String, b:Int) {
              self.init()
          }
      }
      class Bar:Foo {
          override convenience init() {
              self.init(a:"baz", b:42)
          }
          required init(a:String, b:Int) {
              super.init()
          }
      }
      

      如您所见,protocol 强制 init(a:String, b:Int) 成为 required 初始化程序,但对“方便”或“指定”没有任何作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        • 2016-03-11
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多