首页 > 解决方案 > 属性类型“Int”与其包装器类型“EnvironmentObject”的“wrappedValue”属性不匹配

问题描述

我正在尝试使用 @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()
    }
}
func constructView() {
    let myInt = 1
    MyView()
        .environmentObject(myInt)
}

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

如何@EnvironmentObject使用Int?


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

struct MyView: View {
    @Environment var myInt: Int

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

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

标签: environment-variablesswiftui

解决方案


@EnvironmentObject只能与 a 一起使用classInt实际上是一个struct

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

class SharedInt: ObservableObject {
    @Published var myInt = 1
}

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

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

if let windowScene = /* ... */

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

WindowGroup {
    ContentView()
        .environmentObject(SharedInt())
}

推荐阅读