2017-03-29 2 views
0

この質問は、最初から再編集されています。多くの試行の後、主な問題は、特定のプロパティにアクセスする前にフック関数を実行することを保証するプロトコルを設計することです。プロパティゲッターでフック関数を強制するには?

protocol Foo { 
    var bar: Int { get } 
    func hook() 
} 

そして、私は次の試験に合格したい:

func testBarGetterShouldInvokeHooker() { 
    class DummyFoo: Foo { 
     var bar: Int = 0 
     var invoked: Bool = false 
     func hook() { 
      invoked = true 
     } 
    } 
    let foo = DummyFoo() 
    _ = foo.bar 
    XCTAssertTrue(foo.invoked) 
} 

はい、私はフック関数が自動的にフックアップさせることをしたい、それがある - フックする実装構造体/クラスに頼りませんそれは明白です。

これは素晴らしい拡張機能を書くことで実現できると思います。

答えて

0

まず、コードにいくつかのエラーがあります。主なものは次のとおりです。hook()はどこに電話していますか?

基本的な考慮事項がいくつかあります。 のgetbarとするには、計算されたプロパティでなければなりません。より一般的なものにするためには、この変数をプロトコル拡張に実装する必要があります(適合することによって、動作はデフォルトで実装されます)。 Intの値の指定方法は?方法、または別の変数

protocol Foo { 
    func getBarValue() -> Int 
    var invoked: Bool { get set } 
} 

extension Foo { 

    var bar: Int { 
     mutating get { 
      hook() 
      return getBarValue() 
     } 
    } 

    mutating func hook() { 
     print("Hook called") 
     invoked = true 
    } 
} 

私は自分のコードには、 `フック()`の呼び出しがありませんということ、それが問題だのを認識していますプロトコル

struct MyStruct: Foo { 

    var invoked = false 

    func getBarValue() -> Int { 
     return 1 
    } 
} 

var foo = MyStruct() 
_ = foo.bar 
+0

に準拠して、私は」することができますテストメソッドのようないくつかのダミー実装を保証する適切な拡張を書く方法を理解することは、オートフック機能も持っています。あなたの答えは、 'getBarValue'メソッドを直接呼び出して、' hook'をバイパスすることができます。 –

+0

@ NandiinBaoあなたはどこかからその価値を得る必要があり、それは公開されている必要があります。 –

関連する問題