我想裝飾UIViewController,當從另一個類(例如網絡狀態管理器)調用setInteractionEnabled
方法時,能夠調整它的界面。應通過覆蓋onInteractionChanged
在具體控制器中提供所有更改(如果有)。這裏是我的代碼:在協議擴展中的快速關閉
import Foundation
typealias InteractionClosure = ((enabled: Bool) -> Void)
protocol Interaction: class {
var onInteractionChanged: InteractionClosure? { get set }
func setInteractionEnabled(enabled: Bool)
}
extension Interaction where Self: UIViewController {
// Default: Do nothing
// Throws: - Extensions may not contain stored properties
var onInteractionChanged: InteractionClosure? = nil
func setInteractionEnabled(enabled: Bool) {
onInteractionChanged?(enabled: enabled)
}
}
extension UIViewController : Interaction {}
如何爲onInteractionChanged
添加默認實現?
錯誤說明全部 - 擴展名不能包含存儲的屬性。你必須使它成爲一個計算的屬性,在訪問時返回'nil'。雖然協議需要強制執行屬性「{get set}」的設置能力嗎?否則,您必須爲默認屬性實現設置一個空setter。我會讓該屬性成爲一個'{get}',並讓符合類型的用戶選擇是否只想用計算屬性(僅獲取)覆蓋它,或者使用存儲屬性(gettable和settable)。 – Hamish