StateStruct 是一个 Swift 库,旨在通过实现依赖跟踪和变更检测来简化结构体中的状态管理。 它利用 Swift 宏和编译器插件,自动将跟踪代码注入到属性的读取和写入操作中,构建依赖关系图,从而揭示属性在执行期间如何交互和更改。
PropertyNode.hasChanges(writeGraph:readGraph:)
,StateStruct 比较读取和写入依赖关系图,以确定之前访问过的任何属性是否已更改。 这确保了只有相关的更改才会触发响应式更新,从而避免不必要的处理。import StateStruct
@Tracking
struct MyState {
var height: Int = 0
var name: String = ""
var nested: Nested = .init(name: "")
@Tracking
struct Nested {
var name: String = ""
var age: Int = 18
}
}
var state = MyState()
// Tracking read operations
let readTracking = state.tracking {
_ = state.height
_ = state.nested.name
}
// Tracking write operations
let writeTracking = state.tracking {
state.height = 200
}
// Change detection: compare dependency graphs to determine if a change occurred
let hasChanged = PropertyNode.hasChanges(
writeGraph: writeTracking.graph,
readGraph: readTracking.graph
)
// Output: true
UpdatingTests.swift 中的测试用例
嵌套属性的访问和修改
// Reading nested.name
let reading = state.tracking {
_ = state.nested.name
}
// Writing to nested.name
let writing = state.tracking {
state.nested = .init(name: "Foo")
}
// Result: Change detected ✅
无关属性的更改
// Reading nested.name
let reading = state.tracking {
_ = state.nested.name
}
// Writing to unrelated nested.age
let writing = state.tracking {
state.nested.age = 100
}
// Result: No change detected ❌
广泛与狭窄的跟踪
// Reading entire nested object
let reading = state.tracking {
_ = state.nested // Tracks all nested properties
}
// Writing to one nested field
let writing = state.tracking {
state.nested.age = 100
}
// Result: Change detected ✅ (since we're watching all of nested)
每个测试用例都演示了 StateStruct 如何智能地跟踪依赖关系并检测嵌套结构中的更改。 这些示例显示了测试套件中的真实代码片段,并具有明确的预期结果。