【问题标题】:Swift - How to forbid an initializer?Swift - 如何禁止初始化程序?
【发布时间】:2015-02-21 10:04:00
【问题描述】:

考虑以下带有委托的控制器类:

@objc protocol FooControllerDelegate {
}

@objc class FooController: UIViewController {
    var delegate: FooControllerDelegate

    init(delegate: FooControllerDelegate) {
        self.delegate = delegate
        super.init(nibName: nil, bundle: nil)
    }

    // TODO: How do we forbid this init?
    required init(coder aDecoder: NSCoder) {
        // TODO: Fails to compile.
        super.init(coder: aDecoder) 
    }
}

有什么方法可以禁止使用 -initWithCoder: 等价物,而不使委托隐式解包,并在方法中放置 assert(false)

理想情况下,根本没有必要为每个子类编写init(coder:),并且隐式禁止它。

【问题讨论】:

    标签: ios xcode swift uiviewcontroller


    【解决方案1】:
    • 如果目标是禁止使用除您之外的所有指定初始化程序,那么此时没有语言功能。这适用于所有类型的方法。

    重写方法必须是可访问的,因为它是封闭类型

    • 如果目标是避免在每次添加自定义初始化程序时空覆盖init(coder:),那么请考虑convenience 关键字。 Swift 的安全范式假定该类要么添加“额外”初始化,要么必须修改所有必需初始化器的行为。

    "Automatic Initializer Inheritance"

    【讨论】:

      【解决方案2】:

      您是否尝试过使用@available attribute 就像提到的here

      幸运的是,您可以使用 Swift 的 @available 属性来防止这种情况,这也有利于更清楚地传达您不应该使用此初始化程序。

      该解决方案似乎效果很好:

      @available(*, unavailable)
      public required init?(coder: NSCoder) {
              
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 2016-10-20
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        相关资源
        最近更新 更多