Swift - функция для возврата другого значения на основе другой переменной

У меня есть представление (view1) для отображения разных данных, и я хотел бы, чтобы это представление изменилось в зависимости от другой переменной.

      struct View1: View {

let array = myFunc()

var body: some View {
        
    VStack {
    
       Text("\(settings.score)")
            List {
            ForEach(0..<array.count) { section in
        
            NavigationLink(destination: RowDetailView(array: array[section])) {

            RowView(array: array[section])
            }
            }
}
        }

С другой стороны, я устанавливаю объект Observable:

      class GameSettings: ObservableObject {
@Published var score = 1
}

Все это хорошо работает в других точках зрения. Я могу обновить его по мере необходимости.

У меня есть функция для получения переменной массива, и я хотел бы, чтобы она возвращала другой массив в зависимости от текущего значения «score».

      func myFunc() -> [arrayModel] {
@StateObject var settings = GameSettings()

if settings.score == 1 {
var array = [ arrayModel(example: example) ]
return array
}
else if settings.score == 2 {
var array = [ arrayModel(example: example) ]
return array
}
}

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

1 ответ

Если проблема в том, что settings.scoreне является текущим в, и если он находится в представлении SwiftUI, вы можете сделать следующее:

  1. Изменять @StateObject var settings = GameSettings() к @EnvironmentObject var settings: GameSettings, и переместите его наружу myFunc.
  2. В вашем храните ссылку на GameSettings(), как это: static var gameSettings = GameSettings().
  3. В твоей SceneDelegateс scene(_:willConnectTo:options:) функция, поставьте ObservedObject к вашим взглядам, используя .environmentObject модификатор, передав переменную, которую вы сохранили на шаге 2, например:
      func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let contentView = ContentView()

        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView.environmentObject(SceneDelegate.gameSettings))
            self.window = window
            window.makeKeyAndVisible()
        }
    }
Другие вопросы по тегам