SwiftUI:可选类型的值';装订<;字符串>';必须展开为类型为';装订<;字符串>';

SwiftUI:可选类型的值';装订<;字符串>';必须展开为类型为';装订<;字符串>';,swift,swiftui,textfield,Swift,Swiftui,Textfield,我目前正在学习SwiftUI并试图理解@EnvironmentObject,我发现这有点让人困惑 我想在我的应用程序中共享一个包含一些数据的商店,所以我写了以下内容: class Store: ObservableObject { @Published var user: User? } class User: ObservableObject { @Published var name: String? } 我的应用程序视图: struc

我目前正在学习SwiftUI并试图理解
@EnvironmentObject
,我发现这有点让人困惑

我想在我的应用程序中共享一个包含一些数据的商店,所以我写了以下内容:

class Store: ObservableObject {    
    @Published var user: User?    
}

class User: ObservableObject {    
    @Published var name: String?    
}
 
我的应用程序视图:

struct AppView: View {
    @EnvironmentObject var store: Store    

    var body: some View {
            ContentView()
                .environmentObject(store)
        }
    }    
}
情景公使:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {    
    var window: UIWindow?        
    var store = Store()

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            let appView = AppView().environmentObject(store)
            window.rootViewController = UIHostingController(rootView: appView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }    
}
ContentView
中:

struct ContentView: View {
    @EnvironmentObject var store: Store
    
    var body: some View {
        VStack {
            TextField("Type some text here", text: $store.user?.name ?? "")
        }
    }    
}
但是,我在声明
文本字段的行中遇到错误:

必须将可选类型为“Binding”的值展开为类型为“Binding”的值

我不明白这意味着什么,也不知道该怎么办


感谢您的帮助

如果
user
name
变量都可以是
nil
,那么这里有一个可能的解决方案-您需要使用自定义绑定:

struct ContentView: View {
    @EnvironmentObject var store: Store
    
    var binding: Binding<String> {
        .init(get: {
            store.user?.name ?? ""
        }, set: {
            store.user?.name = $0
        })
    }
    
    var body: some View {
        VStack {
            TextField("Type some text here", text: binding)
        }
    }
}
TextField
将正常工作:

TextField("Type some text here", text: $store.user.name)

如果
用户
为零,该怎么办?在
存储
中,如果要消除错误,请选择
用户
(添加
),或者使用
强制将其展开。如果强制展开,则必须在加载视图之前检查
nil
,否则如果有
user=nil
@pawello2222,则会发生崩溃。谢谢您的回答。如果user为nil,我尝试设置默认值(请参见编辑),但仍然存在相同的错误。但是“”不是变量,而是常量。您需要了解,您为
text:
提供的内容是一个变量,TextField可用于将用户输入的文本绑定到该变量。我认为您需要返回并找出一种方法,使
user
在您的商店类型中成为非可选的。
TextField("Type some text here", text: $store.user.name)