| 概念 | 定義 | 關鍵字 | 參數列表 |
|---|---|---|---|
| 重寫 | 子類提供父類同名同參數方法的新實現 | `override` | **完全相同** |
| 重載 | 同類中同名不同參數的多個方法 | 無 | **必須不同** |
❌ 錯誤嘗試:重寫並改變參數(這是重載,非重寫)
// 錯誤:參數列表變了,不是重寫
override init(frame: CGRect, viewController: UIViewController) { ... }
class CustomTextField: UITextField {
weak var ownerVC: UIViewController?
// 1. 指定初始化器重載
init(frame: CGRect, owner: UIViewController) {
self.ownerVC = owner
super.init(frame: frame)
setup()
}
// 2. 必須實現 required 初始化器(編譯器強制)
required init?(coder: NSCoder) {
super.init(coder: coder)
setup()
}
// 3. 重寫父類指定初始化器(保持簽名一致)
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
private func setup() {
delegate = ownerVC as? UITextFieldDelegate
// 其他配置...
}
}
// 不繼承 UITextField,而是持有它
class TextFieldContainer {
let textField = UITextField()
weak var viewController: UIViewController?
init(frame: CGRect, owner: UIViewController) {
self.viewController = owner
textField.frame = frame
textField.delegate = owner as? UITextFieldDelegate
}
}
class CustomView: UIView {
// 1. 重寫指定初始化器
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
// 2. 實現 required 初始化器(支持 Storyboard/XIB)
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
// 3. 共同初始化邏輯
private func commonInit() {
backgroundColor = .white
// 添加子視圖、約束、手勢等
}
}
想給`UITextField`加參數 → **重載**添加新`init`,**必須**實現`required init(coder:)`。**不要試圖重寫並改變參數**,那是語法錯誤。現代Swift開發更推薦**組合模式**,避免繼承帶來的脆弱基類問題。