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 或必须修改所有必需初始化程序的行为。
您尝试过使用 @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) {
}
考虑以下带有委托的控制器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 或必须修改所有必需初始化程序的行为。
您尝试过使用 @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) {
}