通过 Picker 更改 @Published 变量

Change a @Published var via Picker

我想通过 Picker 更改一个@Published 变量,但我发现它无法编译。

我有一个语言结构:

enum Language: Int, CaseIterable, Identifiable, Hashable {
case en
case zh_hant

var description: String {
    switch self {
    case.en:
        return "English"
    case.zh_hant:
        return "繁體中文"
    }
}

var id: Int {
    self.rawValue
}

}

在我的数据模型中,我发布了变量 selectedLanguage

final class ModelData: ObservableObject {
    @Published var currentLanguage: Language = Language.zh_hant         
}

我尝试使用选择器让用户更改语言:

@EnvironmentObject var modelData: ModelData

在视图正文中:

Picker("Selected Language", selection: modelData.currentLanguage) {
                ForEach(Language.allCases, id: \.rawValue) { language in
                    Text(language.description).tag(language)
                }
            }.pickerStyle(SegmentedPickerStyle()).padding(.horizontal)

它说“无法将类型 'Language' 的值转换为预期的参数类型 'Binding'”

如何直接用选择器修改modelData中的currentLanguage?

你们非常亲密。在绑定到 @Published 属性 时,您需要使用 $

Picker("Selected Language", selection: $modelData.currentLanguage) {
            ForEach(Language.allCases, id: \.id) { language in
                Text(language.description).tag(language)
            }
        }.pickerStyle(SegmentedPickerStyle()).padding(.horizontal)

我还将 id: 更改为 \.id 而不是 \.rawValue 这有点无意义,因为它们解决的是同一件事,但在语义上更有意义。