swiftui - 在环境中存储一个模拟对象
问题描述
在我的应用程序中,我想在 Environment 中存储一个对象以从各种视图执行网络查询。但是,在开发过程中,我想改用模拟,并从应用程序包中检索有效负载(JSON 格式)。这些是我采取的步骤:
- 指定协议
typealias Token = String
protocol MyAPIConforming {
func signIn(username: String, password: String, completion: @escaping (Token?, Error?) -> Void)
}
- 实现我需要的两个类
class MockMyAPIManager: MyAPIConforming, ObservableObject {
func signIn(username: String, password: String, completion: @escaping (Token?, Error?) -> Void) {
// Read the JSON document from the app's bundle
}
}
class MyAPIManager: MyAPIConforming, ObservableObject {
func signIn(username: String, password: String, completion: @escaping (Token?, Error?) -> Void) {
// Perform the network request
}
}
- 在环境中注入模拟对象
let myManager = MockMyAPIManager()
// Create the SwiftUI view that provides the window contents.
let contentView = LoginView().environmentObject(myManager)
- 在视图中声明@Environment 对象
struct LoginView: View {
@EnvironmentObject var myManager: MyAPIConforming
...
我确实声明myManager
了,MyAPIConforming
因为我可以传递一个类型为MockMyAPIManager
or的对象MyAPIManager
。
但是,在第 4 步中,我收到以下错误:
属性类型“MyAPIConforming”与其包装器类型“EnvironmentObject”的“wrappedValue”属性不匹配
我不确定该错误是否意味着无法保证采用 to 的对象MyAPIConforming
也将采用该ObservableObject
协议。
那么我需要做什么来存储MockMyAPIManager
或存储MyAPIManager
在环境中?这甚至可能吗?
解决方案
这是一个可能的解决方案
struct LoginView<T: ObservableObject & MyAPIConforming>: View {
@EnvironmentObject var myManager: T
// other code here
}
更新:用法
用于内容视图
LoginView<MyAPIManager>().environmentObject(MyAPIManager())
并用于测试/预览
LoginView<MockMyAPIManager>().environmentObject(MockMyAPIManager())
推荐阅读
- python - 使用带有指数函数的 set_xscale
- loopbackjs - 将存储库注入模型类?
- excel - 创建并使用数组来选择工作表
- angular - 从服务器动态获取 Angular 路由值
- git - IntelliJ 2019.1.3 更新后,我无法将我的代码推送到远程存储库
- python-3.7 - 如何删除python列表中的所有.txt文件
- java - getDeclaredMethod 在 android 9(PIE)中不起作用
- c++ - 仅在另一个网格后面渲染网格
- php - 使用 Webpack Encore 和 Symfony3.4 在 prod 中找不到资产
- c# - 根据文件名运行正确的方法(C#)