我现在正在尝试了解可在应用的许多不同部分中使用的全局变量。
我正在尝试创建一个全局变量“Quarters”,该变量可以在我的应用程序的任何部分使用,并且即使在应用程序关闭/退出后也将保存当前值。
我下面的代码没有增加我的“季度”变量。它只是保持在 0。也没有错误。如果我在 struct ContentView 中有变量,我可以让它工作,但如果我试图让它成为一个全局变量,我就不能工作。
import SwiftUI
struct MyVariables {
var quarters:Int = 0
}
struct ContentView: View {
//@State private var quarters = 0 - if I point to the variable this way, it works
var body: some View {
VStack {
Text("\(MyVariables.quarters)").bold()
Button(action: {
MyVariables.quarters += 1
}) {
Image("QuarterMachine")
}
}
}
}
我相信下面的两个代码可以用来保存变量,但我不确定,因为我无法先弄清楚上面的部分。
import Foundation
protocol Storage {
var quarters: Int { get }
func save(quarters: Int)
}
还有
import Foundation
class LocalStorage: Storage {
private let quartersKey = "quarters"
func reset() {
save(quarters: 0)
}
var quarters: Int {
UserDefaults().integer(forKey: quartersKey)
}
func save(quarters: Int) {
UserDefaults().set(quarters, forKey: quartersKey)
}
}
答案 0 :(得分:1)
要在所有 SwiftUI 视图中保存一个值并以与 UserDefaults 相同的方式保存它,您可以使用 @AppStorage
。只需在其他视图中使用相同的键(本例中的 "quarters"
)来检索保存的值。
至于回答您关于如何在按钮点击的其他地方更新您的值的问题,您可以使用视图模型来处理您的所有逻辑并在您的视图之外使用 @AppStorage
。
struct ContentView: View {
@StateObject var viewModel = GameViewModel()
var body: some View {
VStack {
Text("\(viewModel.quarters)")
.bold()
Button(action: { viewModel.quarters += 1 }) {
Image("QuarterMachine")
}
}
}
}
这是处理逻辑的视图模型。
final class GameViewModel: ObservableObject {
@AppStorage("quarters")
var quarters: Int = .zero
// You can use this method in your code to increase
// your quarters value when your game is finished.
func finishGame() {
quarters += 1
}
}