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

Swift - How to forbid an initializer?

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

@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)

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

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

Overriding method must be accessible as it's enclosing type

  • 如果目标是避免每次添加自定义初始化程序时空覆盖 init(coder:),那么请考虑 convenience 关键字。 Swift 的安全范例假定 class 添加 'additional' init 或必须修改所有必需初始化程序的行为。

"Automatic Initializer Inheritance"

您尝试过使用 @available attribute like mentioned here 吗?

Luckily, you can use Swift’s @available attribute to prevent this, which also has the benefit of more clearly communicating that you should not use this initializer.

该解决方案似乎工作得很好:

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