Swiftui 在环境中存储模拟对象

Swiftui 在环境中存储模拟对象,swiftui,combine,Swiftui,Combine,在我的应用程序中,我想在环境中存储一个对象,以便从各种视图执行网络查询。但是,在开发过程中,我希望使用一个模拟,并从应用程序包中检索有效负载(JSON格式)。以下是我采取的步骤: 指定协议 实现我需要的两个类 在环境中注入模拟对象 在视图中声明@Environment对象 我确实将myManager声明为MyAPIConforming,因为我可以传递类型为mockmyapimager或myapimager的对象 但是,在步骤4中,我得到以下错误: 属性类型“MyAPIConforming”与其包

在我的应用程序中,我想在环境中存储一个对象,以便从各种视图执行网络查询。但是,在开发过程中,我希望使用一个模拟,并从应用程序包中检索有效负载(JSON格式)。以下是我采取的步骤:

  • 指定协议
  • 实现我需要的两个类
  • 在环境中注入模拟对象
  • 在视图中声明@Environment对象
  • 我确实将
    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())