如何從子類中覆寫 Swift 超類的只讀屬性以使該屬性可讀寫?
我想這樣做,因為這是 iOSUIResponder
檔案所說的要求。但是,當我嘗試實作我認為 Swift 5 檔案所說的可以完成的事情時,我遇到了一個錯誤:
斯威夫特 5 檔案
遺產
覆寫屬性獲取器和設定器:您可以通過在子類屬性覆寫中同時提供 getter 和 setter 來將繼承的只讀屬性呈現為讀寫屬性。
什么地方出了錯:
基于前面提到的 Swift 檔案宣告,我沒有找到相應的示例,我創建了以下子類,XCode 在該子類中生成此錯誤訊息:
"無法分配給屬性:'inputAccessoryViewController' 是一個只能獲取的屬性"
我的子類:
class InputAccessoryEnabledTextView : UITextView {
override var inputAccessoryViewController: UIInputViewController? {
get { super.inputAccessoryViewController }
set { super.inputAccessoryViewController = newValue }
}
}
UIResponder
宣言
var inputAccessoryViewController: UIInputViewController? { 得到 }討論
此屬性通常用于將附件視圖控制器附加到系統提供的為 UITextField 和 UITextView 物件呈現的鍵盤。此只讀屬性的值為 nil。如果要將自定義控制元件附加到系統提供的輸入視圖控制器(例如系統鍵盤)或自定義輸入視圖(您在 inputViewController 屬性中提供的),請在 UIResponder 子類中將此屬性重新宣告為讀寫。然后,您可以使用此屬性來管理自定義附件視圖。當接收者成為第一回應者時,回應者基礎結構在顯示之前將附件視圖附加到適當的輸入視圖。
注意:我確實在 Stack Overflow 上看到了 6 年前的一個問題,該問題沒有得到接受的答案,而且似乎沒有正確回答問題,所以請不要在沒有充分理由的情況下將此標記為 dup。或許這些問題以后可以合并
uj5u.com熱心網友回復:
super.inputAccessoryViewController
不可設定。
您在子類中重寫的實作self.inputAccessoryViewController
是.
通過向子類中的屬性添加 setter,您不會自動在超類中添加相同的東西。子類中的內容保留在子類中。
所以并不是你不能通過添加一個setter來覆寫一個屬性,你只是不能在這里設定它:
override var inputAccessoryViewController: UIInputViewController? {
get { super.inputAccessoryViewController }
set { super.inputAccessoryViewController = newValue }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
你可以做其他事情,比如:
override var inputAccessoryViewController: UIInputViewController? {
get { super.inputAccessoryViewController }
set { print("I just go set to \(newValue)") }
}
但這不是很有用。你想要的可能是:
private var myInputAccessoryController: UIInputViewController?
override var inputAccessoryViewController: UIInputViewController? {
get { myInputAccessoryController }
set { myInputAccessoryController = newValue }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/489141.html