如何在属性getter中强制钩子函数?

时间:2017-03-29 11:42:23

标签: swift

此问题从头开始重新编辑。经过大量试验,我发现主要问题是设计一个协议,保证在访问某个属性之前执行钩子函数。

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

是的,我希望自动挂钩钩子函数,即 - 不依赖于实现struct / class来显式挂钩它。

我认为这可以通过编写一些不错的扩展来实现。

1 个答案:

答案 0 :(得分:0)

让我们首先说你的代码有一些错误,主要的一个是:你在哪里调用hook()

有一些基本的考虑要做。要调用get barbar必须是计算属性。为了使其更通用,您应该在协议扩展中实现此变量(通过符合,默认情况下将实现该行为)。 如何提供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