Swiftui 在环境中存储模拟对象
在我的应用程序中,我想在环境中存储一个对象,以便从各种视图执行网络查询。但是,在开发过程中,我希望使用一个模拟,并从应用程序包中检索有效负载(JSON格式)。以下是我采取的步骤:Swiftui 在环境中存储模拟对象,swiftui,combine,Swiftui,Combine,在我的应用程序中,我想在环境中存储一个对象,以便从各种视图执行网络查询。但是,在开发过程中,我希望使用一个模拟,并从应用程序包中检索有效负载(JSON格式)。以下是我采取的步骤: 指定协议 实现我需要的两个类 在环境中注入模拟对象 在视图中声明@Environment对象 我确实将myManager声明为MyAPIConforming,因为我可以传递类型为mockmyapimager或myapimager的对象 但是,在步骤4中,我得到以下错误: 属性类型“MyAPIConforming”与其包
myManager
声明为MyAPIConforming
,因为我可以传递类型为mockmyapimager
或myapimager
的对象
但是,在步骤4中,我得到以下错误:
属性类型“MyAPIConforming”与其包装类型“EnvironmentObject”的“wrappedValue”属性的类型不匹配
我不确定该错误是否意味着无法保证采用MyAPIConforming
的对象也将采用observateObject
协议
那么,我需要做什么才能在环境中存储
mockmyapimager
或myapimager
?这可能吗?这里有一个可能的解决方案
struct LoginView<T: ObservableObject & MyAPIConforming>: View {
@EnvironmentObject var myManager: T
// other code here
}
struct LoginView:View{
@环境对象变量myManager:T
//这里还有其他代码
}
更新:用法
用于内容视图
LoginView<MyAPIManager>().environmentObject(MyAPIManager())
LoginView().environmentObject(MyAPIManager())
用于测试/预览
LoginView<MockMyAPIManager>().environmentObject(MockMyAPIManager())
LoginView().environmentObject(MockMyAPIManager())
谢谢,但是如果我这样做,那么我会在调用站点中得到一个错误:无法推断通用参数“T”
。修复程序似乎是让contentView=LoginView().environmentObject(myManager)
,但随后我得到的协议类型“observeobject&MyAPIConforming”的值不能与“observeobject”一致;只有结构/枚举/类类型才能符合协议
。
struct LoginView: View {
@EnvironmentObject var myManager: MyAPIConforming
...
struct LoginView<T: ObservableObject & MyAPIConforming>: View {
@EnvironmentObject var myManager: T
// other code here
}
LoginView<MyAPIManager>().environmentObject(MyAPIManager())
LoginView<MockMyAPIManager>().environmentObject(MockMyAPIManager())