全局变量不增加? - 即使在应用程序关闭后也想保存全局变量

时间:2021-05-15 21:56:35

标签: ios swift swiftui

我现在正在尝试了解可在应用的许多不同部分中使用的全局变量。

我正在尝试创建一个全局变量“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)
    }
}

1 个答案:

答案 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
  }
}
相关问题