![](/img/trans.png)
[英]'required' initializer 'init(coder:)' must be provided by subclass of UIViewController
[英]It shows “required initializer init must be provided in subclass of UIControl” When I override init(frame: CGRect)
此代碼有效:
import UIKit
class wheel: UIControl {
}
但是這段代碼沒有:
class wheel: UIControl {
override init(frame: CGRect) {
super.init(frame: frame)
}
當我覆蓋init(frame:CGRect)而不是init(coder aDecoder: NSCoder)
時,它顯示錯誤“ 必須在UIControl
子類中提供所需的初始化程序初始化 ”。
為什么我必須實現init(coder aDecoder: NSCoder)
? 如果我沒有實現init(frame: CGRect)
,為什么我不需要實現呢?
我發現了一個類似的Stack Overflow帖子,但它沒有解釋: Swift:錯誤:'required'initulator'init(coder :)'必須由'UIView'的子類提供
看。 根據Apple文檔, Swift子類默認不繼承其超類初始值設定項。 它們僅在某些情況下繼承,其中之一是:如果您的子類未定義任何指定的初始值設定項,則它會自動繼承其所有超類指定的初始值設定項。 因此,如果您沒有實現init(frame: CGRect)
則繼承所有超級初始值設定項。
UIView也采用NSCoding協議,它需要一個init(coder:)
初始化器。 因此,如果您正在實現init(frame: CGRect)
,則您的類不再繼承超級初始化器。 所以你也必須實現那個:
required init?(coder decoder: NSCoder) {
super.init?(coder: decoder)
}
在創建模型對象子類時,有時可能需要添加自己的自定義初始化方法以增加方便性。
由於Swift內省存在一些限制,這些方法不能被指定為類的初始化器。 取而代之的是,他們需要被標記為使用相同名稱的關鍵字雨燕方便初始化這樣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.