现在,我遇到了一个注册协议符合ObservableObject的问题.因为ObservableObject使用关联的类型,所以我找不到一种方法来注册它而不出现编译错误.

这是我的简单模型,名为A

protocol A: ObservableObject {}

这是我的简单类,名为B

final class B: A {}

这是我的集会

final class ViewStoreAssembly: Assembly{
    func assemble(container: Container) {
        container.register(A.self) { _ in
            B()
        }
    }
}

我正在try 注册符合ObservableObject的A,但编译错误显示

协议‘A’只能用作一般约束,因为它具有 自身或关联的类型要求

有人知道如何解决这个问题吗?这样做的好处是

  1. 在SwiftUI中,我们可以将视图从ViewStore/Presenter中分离出来,这样就可以将视图与view Model Holder分开
  2. 可以通过模拟视图轻松测试ViewStore/Presenter

推荐答案

最好使用以下组合(无论如何,ObservableObject只对类有意义,它对模型协议本身没有任何意义,并且不可能像ObservedObject那样在协议周围有观察者).

protocol A {}

final class B: ObservableObject, A {}

我认为以下主题也会有帮助:

How to define a protocol as a type for a @ObservedObject property?

How to create Generic if @EnvironmentObject?

Swift相关问答推荐

像WebSocket一样接收实时更新,但通过异步/等待或组合

MacOS 13-如何使用SwiftUI创建Message.App设置工具栏?

在 SwiftUI 视图中观察 UIViewRepresentable 的 @State var 变化

ToolbarItem 包含在动画中但不应该包含在动画中

URL appendPathComponent(_:) 已弃用?

从 iPhone 中的安全飞地获取真正的随机数?

有没有更快的方法来循环浏览 macOS 上已安装的应用程序?

并发执行代码中捕获的 var 的变异

在主要参与者中启动分离任务和调用非隔离函数之间的区别

如何在 Swift 中对单个单词进行词形还原

如何在 Swift 中使用子定义覆盖父类扩展

SwiftUI - Select 器没有 Select 值

SwiftUI Grid 中的数组旋转

带有屏幕参数的 NSWindow 初始化程序在初始化时导致致命错误

从 Finder 打开文件时,SwiftUI 的应用程序(_ openFile:) 从未调用过

找不到接受提供的参数的/的重载

如何在 Xcode 中的 UITests 下以通用方式访问后退栏按钮项?

swift 3 错误:参数标签 '(_:)' 不匹配任何可用的重载

如何从 UITableViewCell 类中引用 UITableViewController?

滑动侧边栏菜单 IOS 8 Swift