Глобальная переменная в Swiftui

У меня есть перечисление, которое определяет индекс языка. Я поместил это перечисление в файл с именем Language.swift

enum Language: Int {
    case en
    case zh_hant    
}

Я попытался объявить глобальную переменную, в которой хранится текущий язык.

final class ModelData: ObservableObject {
    @Published var currentLanguage: Language = Language.zh_hant
    @Published var globalString: [String] = load("strings.json")
}

Однако, когда я попытался получить к нему доступ, у меня возникла следующая ошибка:

struct HomeView: View {

    @EnvironmentObject var modelData: ModelData
    
    var body: some View {
        Text("\(modelData.currentLanguage.rawValue)") // error, see the screen capture
        Text("\(modelData.globalString.count)") // no problem
    }
}

введите описание изображения здесь

Тем не менее, я использовал тот же способ доступа к массиву, нет проблем.

Вышеупомянутую ошибку можно устранить, переместив enum Language в тот же файл, что и класс ModelData.

Однако тогда была выявлена ​​другая проблема.

Я попытался сделать это в своем коде:

var languageIndex: Int {
        modelData.currentLanguage.rawValue
    }
var body: some View {
    Text("\(modelData.globalString[languageIndex])") // preview cause "updating took more than 5 seconds]
}

Моя глобальная строка похожа на эту [Привет,]

Проблема появляется в представлении холста при предварительном просмотре пользовательского интерфейса. Тем не менее, похоже, что в симуляторе он работает нормально. Любая идея?


person user6539552    schedule 24.01.2021    source источник
comment
Нет ошибок с Xcode 12.1, просто скопируйте / вставьте код. Возможно, у вас есть конфликт с другим кодом в вашем проекте.   -  person Asperi    schedule 24.01.2021
comment
Я поместил перечисление Language в файл с именем Language.swift и, следовательно, вызвал ошибку. Я не могу поместить их в другой файл, отличный от класса ModelData?   -  person user6539552    schedule 24.01.2021


Ответы (1)


Проблема появляется в представлении холста при предварительном просмотре пользовательского интерфейса. Тем не менее, похоже, что в симуляторе он работает нормально.

Вы должны установить объект среды в предварительном просмотре

struct HomeView_Previews: PreviewProvider {
  static var previews: some View {
    HomeView()
      .environmentObject(ModelData())
  }
}
person MilesStanfield    schedule 24.01.2021