属性类型“Int”与其包装类型“EnvironmentObject”的“wrappedValue”属性不匹配

Sen*_*ful 10 environment-variables swiftui

我正在尝试使用 @EnvironmentObject 将数据传递给我的 SwiftUI 视图:

struct MyView: View {
    @EnvironmentObject var myInt: Int // ? Property type 'Int' does not match that of the 'wrappedValue' property of its wrapper type 'EnvironmentObject'

    var body: some View {
        EmptyView()
    }
}
Run Code Online (Sandbox Code Playgroud)
func constructView() {
    let myInt = 1
    MyView()
        .environmentObject(myInt)
}
Run Code Online (Sandbox Code Playgroud)

带有@EnvironmentObject 的行有一个编译器错误(如上所列)。

如何使用@EnvironmentObjectInt


更新:一个想法是@EnvironmentObject只能与符合 的类一起使用ObservableObject,所以我尝试切换到@Environment现在编译的部分,但产生了不同的错误:

struct MyView: View {
    @Environment var myInt: Int

    var body: some View {
        EmptyView()
    }
}
Run Code Online (Sandbox Code Playgroud)
func constructView() {
    let myInt = 1
    MyView() // ? Missing argument for parameter 'myInt' in call
        .environment(\.myInt, myInt)
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试构建它时,它抱怨myInt未设置。

Geo*_*e_E 10

@EnvironmentObject可以用一个使用classInt实际上是一个struct.

如果您确实想尝试IntViews之间共享它,您可以将值包装在一个类中:

class SharedInt: ObservableObject {
    @Published var myInt = 1
}
Run Code Online (Sandbox Code Playgroud)

此外,它应该在里面看起来更像这样SceneDelegate.swift

let contentView = ContentView().environmentObject(SharedInt())

if let windowScene = /* ... */
Run Code Online (Sandbox Code Playgroud)

或者在 SwiftUI 生命周期中...App.swift

WindowGroup {
    ContentView()
        .environmentObject(SharedInt())
}
Run Code Online (Sandbox Code Playgroud)


Pro*_*in8 7

如果你想使用环境系统,你需要提供一个密钥来访问它。您不能使用未注册的密钥(这是您的错误所在)。首先,创建一个EnvironmentKey

struct MyIntEnvironmentKey: EnvironmentKey {
    static var defaultValue = 0
}
Run Code Online (Sandbox Code Playgroud)

接下来,创建一个关键路径来设置/获取您的环境值:

extension EnvironmentValues {
    var myInt: Int {
        get { self[MyIntEnvironmentKey.self] }
        set { self[MyIntEnvironmentKey.self] = newValue }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在父视图中设置它:

MyView().environment(\.myInt, myInt)
Run Code Online (Sandbox Code Playgroud)

至关重要的是,您需要在要引用它的视图中引用键:

struct MyView: View {
    @Environment(\.myInt) private var myInt: Int

    var body: some View {
        Text("\(self.myInt)")
    }
}
Run Code Online (Sandbox Code Playgroud)