首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建泛型if @EnvironmentObject?

如何创建泛型if @EnvironmentObject?
EN

Stack Overflow用户
提问于 2020-05-23 13:19:37
回答 1查看 2.1K关注 0票数 2

最近,我发现需要编写一个Class模型,因为它会导致SwiftUI preview无法工作。不幸的是,我得到了错误:

代码语言:javascript
复制
Property type 'T' does not match that of the 'wrappedValue' property of its wrapper type 'EnvironmentObject'

在视图结构中:

代码语言:javascript
复制
struct ContentView<T>: View {
    @EnvironmentObject var mockFoobar: T
    ...
}

还有错误:

代码语言:javascript
复制
Type of expression is ambiguous without more context

预览结构:

代码语言:javascript
复制
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        let mockFoobar: MockFoobar = MockFoobar()
        return ContentView<MockFoobar>()
            .environmentObject(mockFoobar)
    }
}

MockFoobar类是:

代码语言:javascript
复制
class MockFoobar: ObservableObject {
  ...
}

如用户@Asperi所提供的,按建议对以下内容进行了测试:

代码语言:javascript
复制
class Foobar: ObservableObject {
    @Published var param: Bool = false
    func start() {
        self.param = true
    }
}

struct MyFoobarView<T: ObservableObject>: View {
    @EnvironmentObject var foobar: T
    
    var body: some View {
        VStack {
            Text("Hello Foobar")
        }
        .onAppear {
            self.foobar.start()
        }
    }
}

struct MyFoobarView_Previews: PreviewProvider {
    static var previews: some View {
        let foobar: Foobar = Foobar()
        return MyFoobarView()
            .environmentObject(foobar)
    }
}

但是,我得到以下错误(第一个在.onAppear中,第二个在PreviewProvider中):

代码语言:javascript
复制
Cannot call value of non-function type 'Binding<Subject>'

Generic parameter 'T' could not be inferred
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-23 13:31:38

EnvironmentObject必须是ObservableObject,所以这里是修复

代码语言:javascript
复制
struct ContentView<T: ObservableObject>: View {
    @EnvironmentObject var mockFoobar: T
    
    // .. other code here

更新:添加了带有引入模型协议的演示

代码语言:javascript
复制
protocol Foobaring {
    var param: Bool { get set }
    func start()
}

class Foobar: ObservableObject, Foobaring {
    @Published var param: Bool = false
    func start() {
        self.param = true
    }
}

struct MyFoobarView<T: ObservableObject & Foobaring>: View {
    @EnvironmentObject var foobar: T

    var body: some View {
        VStack {
            Text("Hello Foobar")
        }
        .onAppear {
            self.foobar.start()
        }
    }
}

struct MyFoobarView_Previews: PreviewProvider {
    static var previews: some View {
        let foobar: Foobar = Foobar()
        return MyFoobarView<Foobar>()
            .environmentObject(foobar)
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61972651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档