使用 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
}
}
我有一个应用程序,我可以在其中给自己计时,看看我完成一堆问题需要多长时间。我将时间转移到另一个 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
}
}