使用 UserDefaults 相互替换值

Values replacing each other using UserDefaults

我有一个应用程序,我可以在其中给自己计时,看看我完成一堆问题需要多长时间。我将时间转移到另一个 VC 并显示在标签中。我通过按下按钮来存储它,但是当我有一个新变量(时间)时,它会替换它。我如何存储值数组并且可以在标签中显示?

保存值的按钮:

@IBAction func saveScore(_ sender: Any) {
    scoreLabel.text = label.text
    UserDefaults.standard.set(scoreLabel.text, forKey: "score")
}

永久保存数据的代码:

override func viewDidAppear(_ animated: Bool) {
    if let x = UserDefaults.standard.object(forKey: "score") as? String {
        scoreLabel.text = x
    }
}

我的scoreLabel显示我所有的分数,label显示你刚刚得到的时间。

UserDefaults 上使用以下扩展来存储时间数组:

extension UserDefaults {
    var times: [String] {
        get {
            if let times = UserDefaults.standard.object(forKey: "times") as? [String] {
                return times
            } else {
                return []
            }
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "times")
        }
    }
}

虽然您不需要扩展 UserDefaults,但使用扩展可以稍微简化对持久化值的处理,并使代码更简洁。

然后在显示数据的位置,使用以下行访问数组:

let arrayOfTimes = UserDefaults.standard.times
scoreLabel.text = "\(arrayOfTimes)" // or any other formatting you'd like

而不是设置时间来保存一个新的分数,只需将新的分数添加到数组中,例如:

// This will not only add the scoreLabel.text to the array, but also persists it
UserDefaults.standard.times.append(scoreLabel.text)

在Swift4,

将数组保存到用户默认值,您可以这样做:

 let defaults = UserDefaults.standard

 let array = [25, 50]

 defaults.set(array, forKey: "Scores")

从用户默认值访问数组:

 let defaults = UserDefaults.standard

 let retrievedArray = defaults.array(forKey: "Scores") as? [Int] ?? []

如果您要在标签中显示数组的分数,那么您只需执行以下操作:

 scoreLabel.text = String(describing: retrievedArray[0])

If you are using integers for your scoring system, I would suggest you storing your scores as Int in User Defaults.

如果您更喜欢使用 Strings,请注意您可以直接使用用户默认值的 stringArray(forKey:) 方法,而不是 array(forKey:) 方法,因此,在这种情况下,您不需要输入数组:

let someStringArray = defaults.stringArray(forKey: "ArrayOfStrings")

注意:为了回答你的问题,我会考虑你使用的是智力分数,但你可以随意使用你喜欢的分数。

如果您想在用户默认值每次获得新分数时将数组存储到相同的键,您可以这样做它很容易像这样:

let defaults = UserDefaults.standard

// Your new score:

let newScore = 75

// Get your current scores list from User Defaults:

var currentArray = defaults.array(forKey: "Scores") as? [Int] ?? []

// Append your new score to the current array:              

let updatedArray = currentArray.append(newScore)

// And save your updated array to User Defaults:

defaults.set(updatedArray, forKey: "Scores")

// In this example, your User Defaults now contains the updated array [25, 50, 75]

就是这样:)。

请注意,不需要为此使用扩展程序..

更新: 此外,如果您想在 viewDidAppear 方法中添加一些内容,请不要忘记添加 super.viewDidAppear(animated)viewDidLoad等也是如此

documentation 状态:

You can override this method to perform additional tasks associated with presenting the view. If you override this method, you must call super at some point in your implementation.

所以你会:

override func viewDidAppear(_ animated: Bool) {
   super.viewDidAppear(animated)

    if let retrievedArray = defaults.array(forKey: "Scores") as? [Int] {

        print(retrievedArray)

        // You can access your scores array safely here
    }
}