setInteractionEnabled
メソッドが別のクラス(例:ネットワーク状態マネージャ)から呼び出されたときにUIViewControllerのインターフェイスを調整する機能を装飾したいと思います。すべての変更(ある場合)は、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} 'の設定を強制する必要がありますか?それ以外の場合は、デフォルトのプロパティ実装用の空のセッターを用意する必要があります。私はプロパティを '{get}'にし、適合した型に計算されたプロパティ(getのみ)を単にオーバーライドするのか、ストアドプロパティ(gettableとsettable)を使うのかを選択できます。 – Hamish