2017-03-29 1 views
0

Diese Frage wird von Grund auf neu bearbeitet. Nach vielen Versuchen stelle ich fest, dass das Hauptproblem darin besteht, ein Protokoll zu entwerfen, das garantiert, dass eine Hook-Funktion ausgeführt wird, bevor auf ihre bestimmte Eigenschaft zugegriffen wird.Wie erzwinge ich eine Hook-Funktion in einem Eigenschaften-Getter?

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

Und ich möchte, dass die folgenden Test bestehen:

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

Ja, ich möchte, dass Hook-Funktion automatisch angeschlossen werden, das ist - nicht auf die Umsetzung struct unter Berufung/Klasse Haken es explizit.

Ich denke, dass dies durch das Schreiben einiger schöner Erweiterungen erreicht werden könnte.

Antwort

0

Lassen Sie uns damit beginnen, dass Ihr Code einige Fehler hat, der wichtigste ist: wo rufst du hook() an?

Es gibt einige grundlegende Überlegungen zu tun. Um die get von bar genannt zu bekommen, muss bar eine berechnete Eigenschaft sein. Um es generischer zu machen, sollten Sie diese Variable in der Protokollerweiterung implementieren (durch Anpassung wird das Verhalten standardmäßig implementiert). Wie stellt man den Int Wert zur Verfügung? Bei einem Verfahren oder eine andere Variable

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

Das entspricht das Protokoll

struct MyStruct: Foo { 

    var invoked = false 

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

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

Ich bin mir bewusst, dass es keine 'Haken()' Anruf in meinem Code, dass die Frage ist, kann ich‘ t herauszufinden, wie man die richtige Erweiterung schreibt, die eine Dummy-Implementierung wie die in der Testmethode garantiert, hat auch die Funktion zum automatischen Einhaken. Was Ihre Antwort angeht, kann man die Methode 'getBarValue' direkt aufrufen, um 'hook' aufzurufen. –

+0

@NandiinBao Sie müssen diesen Wert von irgendwo bekommen, und es muss öffentlich sein. –

Verwandte Themen