簡體   English   中英

它顯示“必須在UIControl的子類中提供必需的初始化程序初始化”當我重寫init(frame:CGRect)時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM