gpt4 book ai didi

swift - 使用 @ObservedObject 时是否可以在 Swift 中嵌套属性包装器?

转载 作者:行者123 更新时间:2023-12-03 08:32:19 25 4
gpt4 key购买 nike

我最近开始深入研究 SwiftUI、Combine 和属性包装器的奇妙世界,并且正在努力将 @ObservedObject 与我编写的 @Injected 属性包装器结合起来,以将依赖项注入(inject)到我的 View 中。大多数时候,我的 @Injected 包装器工作正常,但是当与 @ObservedObject 配合使用来管理我的 View 模型时,我收到“属性类型与 'wrappedValue' 属性的类型不匹配”错误。”

这是我的 @Injected 属性包装器目前的样子:

@propertyWrapper
public struct Injected<Service> {

private var service: Service

public init() {
self.service = assembler.resolver.resolve(Service.self)!
}

public init(name: String? = nil, container: Resolver? = nil) {
// `assembler` here referring to my global Swinject assembler
self.service = container?.resolve(Service.self, name: name) ??
assembler.resolver.resolve(Service.self, name: name)!
}

public var wrappedValue: Service {
get {
return service
}

mutating set {
service = newValue
}
}

public var projectedValue: Injected<Service> {
get {
return self
}

mutating set {
self = newValue
}
}
}

这是我当前的用法:

struct MyModalView: View {

@ObservedObject @Injected var viewModel: MyModalViewModel

var body: some View {
Text("Hello World")
}
}

以这种方式排序包装器,我收到:“属性类型“MyModalViewModel”与其包装器类型“ObservedObject”的“wrappedValue”属性不匹配”,而 MyModalViewModel 类确实从 ObservableObject 扩展。

如果我翻转包装器,它会编译,但 Swinject 尝试解析包装的 ObservedObject 类,并且由于容器只是注册原始 MyModalViewModel 类,因此此解析失败并且应用程序崩溃。

同时,通过直接赋值来分配 @ObservedObject 值是可行的:

@ObservedObject var viewModel: MyModalViewModel = assembler.resolver.resolve(MyModalViewModel.self)!

我认为原始代码应该编译,看到 @Injected 将返回一个符合 ObservableObject 的包装值,就像 @ObservedObject 期望的那样,尽管所有这些对我来说仍然相当新,所以可能缺少一些东西。如有任何意见,我们将不胜感激。谢谢!!

最佳答案

对于将来遇到此问题的任何人,我最终将这两个属性包装器合并在一个屋檐下,借用 Resolver 的实现。项目:

@propertyWrapper
public struct InjectedObject<Service>: DynamicProperty where Service: ObservableObject {

@ObservedObject private var service: Service

public init() {
self.service = assembler.resolver.resolve(Service.self)!
}

public init(name: String? = nil, container: Resolver? = nil) {
self.service = container?.resolve(Service.self, name: name) ??
assembler.resolver.resolve(Service.self, name: name)!
}

public var wrappedValue: Service {
get { return service }
mutating set { service = newValue }
}

public var projectedValue: ObservedObject<Service>.Wrapper {
return self.$service
}
}

关于swift - 使用 @ObservedObject 时是否可以在 Swift 中嵌套属性包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64764290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com