Backport implementation of Swift's Observation framework with access to @_spi(SwiftUI) APIs.
| CI Status |
|---|
The official Observation framework in Swift Toolchain doesn't ship with package.swiftinterface, preventing direct use of @_spi(SwiftUI) APIs. There are two solutions to this problem, but this project provides solution 2:
-
Manual workaround (not included): Construct a
package.swiftinterfaceand add it to the toolchain (⚠️ No API stability, may break between toolchain versions) -
OpenObservation approach (this project): Reimplement Observation framework, allowing OpenSwiftUI to import it via
@_spi(OpenSwiftUI)
The current implementation is aligned with Swift's release/6.1 branch implementation of the Observation framework.
- Full Observation framework implementation
- Cross-platform support (macOS, iOS, tvOS, watchOS)
@Observablemacro support- Thread-safe tracking
- Pure Swift fallback for platforms without toolchain support
dependencies: [
.package(url: "https://github.com/OpenSwiftUIProject/OpenObservation", from: "1.0.0")
]Comprehensive documentation is available on Swift Package Index.
import OpenObservation
@Observable
class Counter {
var value: Int = 0
func increment() {
value += 1
}
}
// Use with ObservationTracking
let counter = Counter()
withObservationTracking {
print("Counter value: \(counter.value)")
} onChange: {
print("Counter changed!")
}OPENSWIFTUI_SWIFT_TOOLCHAIN_SUPPORTED: Enable Swift toolchain runtime implementation (auto-detected)- Config
OPENSWIFTUI_SWIFT_TOOLCHAIN_PATHandOPENSWIFTUI_SWIFT_TOOLCHAIN_VERSION
- Config
OPENOBSERVATION_DEVELOPMENT: Development mode
- OpenObservation code: MIT License
- Code derived from Swift project: Apache License v2.0 with Runtime Library Exception
See LICENSE file.