StateStruct - @Tracking

简介

StateStruct 是一个 Swift 库,旨在通过实现依赖跟踪和变更检测来简化结构体中的状态管理。 它利用 Swift 宏和编译器插件,自动将跟踪代码注入到属性的读取和写入操作中,构建依赖关系图,从而揭示属性在执行期间如何交互和更改。

主要特性

依赖跟踪

变更检测

Swift 宏

写时复制 (COW) 支持

嵌套状态支持

使用示例

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 中的测试用例

  1. 嵌套属性的访问和修改

    // 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 ✅
  2. 无关属性的更改

    // 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 ❌
  3. 广泛与狭窄的跟踪

    // 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 如何智能地跟踪依赖关系并检测嵌套结构中的更改。 这些示例显示了测试套件中的真实代码片段,并具有明确的预期结果。