Initial prototype for Swift 6 mode

This commit is contained in:
John Estropia
2026-07-07 11:18:17 +09:00
parent 38ec439b18
commit 49f65601cd
71 changed files with 998 additions and 684 deletions
+30 -10
View File
@@ -23,9 +23,9 @@
// SOFTWARE.
//
#if canImport(Combine) && canImport(SwiftUI)
#if canImport(Observation) && canImport(SwiftUI)
import Combine
import Observation
import SwiftUI
@@ -62,19 +62,22 @@ public struct ObjectState<O: DynamicObject>: DynamicProperty {
- parameter objectPublisher: The `ObjectPublisher` that the `ObjectState` will observe changes for
*/
@MainActor
public init(_ objectPublisher: ObjectPublisher<O>?) {
self.observer = .init(objectPublisher: objectPublisher)
self._observer = .init(wrappedValue: .init(objectPublisher: objectPublisher))
}
// MARK: @propertyWrapper
@MainActor
public var wrappedValue: ObjectSnapshot<O>? {
return self.observer.item
}
@MainActor
public var projectedValue: ObjectPublisher<O>? {
return self.observer.objectPublisher
@@ -91,19 +94,36 @@ public struct ObjectState<O: DynamicObject>: DynamicProperty {
// MARK: Private
@ObservedObject
@State
private var observer: Observer
// MARK: - Observer
private final class Observer: ObservableObject {
@MainActor
private final class Observer: Observation.Observable {
@Published
var item: ObjectSnapshot<O>?
private let registrar = ObservationRegistrar()
private var _item: ObjectSnapshot<O>?
let objectPublisher: ObjectPublisher<O>?
var item: ObjectSnapshot<O>? {
get {
self.registrar.access(self, keyPath: \.item)
return self._item
}
set {
self.registrar.withMutation(of: self, keyPath: \.item) {
self._item = newValue
}
}
}
init(objectPublisher: ObjectPublisher<O>?) {
guard
@@ -112,12 +132,12 @@ public struct ObjectState<O: DynamicObject>: DynamicProperty {
else {
self.objectPublisher = nil
self.item = nil
self._item = nil
return
}
self.objectPublisher = objectPublisher
self.item = objectPublisher.snapshot
self._item = objectPublisher.snapshot
objectPublisher.addObserver(self) { [weak self] (objectPublisher) in
@@ -129,7 +149,7 @@ public struct ObjectState<O: DynamicObject>: DynamicProperty {
}
}
deinit {
isolated deinit {
self.objectPublisher?.removeObserver(self)
}