簡體   English   中英

如何覆蓋 Swift 子類中的只讀屬性,使其可讀寫並分配給超類?

[英]How to override readonly property in Swift subclass, make it read-write, and assign to superclass?

如何從子類中覆蓋 Swift 超類的只讀屬性以使該屬性可讀寫?

我想這樣做,因為 iOS UIResponder文檔說這是必需的。 但是,當我嘗試實現我認為 Swift 5 文檔所說的可以完成的事情時,我遇到了一個錯誤:

斯威夫特 5 文檔

遺產

覆蓋屬性獲取器和設置器

什么地方出了錯:

基於前面提到的 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 子類中將此屬性重新聲明為可讀寫。 然后,您可以使用此屬性來管理自定義附件視圖。 當接收者成為第一響應者時,響應者基礎結構在顯示之前將附件視圖附加到適當的輸入視圖。

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 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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