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, вы можете сделать следующее:
- Изменять
@StateObject var settings = GameSettings()
к@EnvironmentObject var settings: GameSettings
, и переместите его наружуmyFunc
. - В вашем храните ссылку на
GameSettings()
, как это:static var gameSettings = GameSettings()
. - В твоей
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()
}
}