此问题从头开始重新编辑。经过大量试验,我发现主要问题是设计一个协议,保证在访问某个属性之前执行钩子函数。
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来显式挂钩它。
我认为这可以通过编写一些不错的扩展来实现。
答案 0 :(得分:0)
让我们首先说你的代码有一些错误,主要的一个是:你在哪里调用hook()
?
有一些基本的考虑要做。要调用get
bar
,bar
必须是计算属性。为了使其更通用,您应该在协议扩展中实现此变量(通过符合,默认情况下将实现该行为)。
如何提供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