有没有办法将一个 ObservableObject 中的 Published var 嵌入到另一个 ObservableObject 中?

Is there a way to embed a Published var in one ObservableObject into another ObservableObject?

我有一个 Auth store(一个 ObservableObject),它存储用户是否已经通过应用程序的身份验证。我在用户登录时管理身份验证存储,实质上是将身份验证状态从 notAuthenticated 更改为已验证。我在另一个 ObservableObject 的 ViewModel 中使用相同的状态变量,它引用 Auth store 单例对象。我认为可能有比下沉变量并在 ViewModel 上更新它更简单的方法(比如直接在 ViewModel 中嵌入 Auth 变量)。

这是授权商店模型的简化代码

class Auth: ObservableObject {
    
    static let shared = Auth()

    @Published var currentState: AuthState = .notAuthenticated

    enum AuthState {
        case notAuthenticated
        case authenticated
    }
}

这是简化的视图模型

class SampleViewModel: ObservableObject {

    @Published var authState = Auth.shared.currentState

    init() {
    
        Auth.shared.$currentState.sink { newAuthState in
             self.authState = newAuthState
        } // Is there any simple way in which I can skip sinking the publishr
    }
}

这是依赖注入的好时机,正如@Asperi 在评论中提到的那样,拥有两个反映相同状态的有状态对象无论如何都不是一个好主意...

恕我直言,像这样更好:

class SampleViewModel: ObservableObject {

    let authState: AnyPublisher<Auth.AuthState, Never>

    init<P>(authState: P) where P: Publisher, P.Output == Auth.AuthState, P.Failure == Never {
        self.authState = authState.eraseToAnyPublisher()
    }
}

然后用如下代码创建它:

let viewModel = SampleViewModel(authState: Auth.shared.$currentState)

为了测试,您可以注入一个测试值。