Swift - 如何禁止初始化程序?

时间:2015-02-21 10:04:01

标签: ios xcode swift uiviewcontroller

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

@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:),并且隐式禁止它。

2 个答案:

答案 0 :(得分:5)

  • 如果目标是禁止使用所有指定的初始化程序,那么目前还没有语言功能。这适用于各种方法。
  

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

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

"Automatic Initializer Inheritance"

答案 1 :(得分:0)

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

<块引用>

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

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

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