我正在尝试学习如何使用UserDefaults,并且无法弄清楚如何存储我需要存储的其中一个值。
我有这个枚举:
enum CalculationFormula: Int {
case Epley
case Brzychi
case Lander
case Lombardi
case MayhewEtAl
case OConnerEtAl
}
这个类有一个名为'selectedFormula'的属性,我希望能够存储为NSUserDefaults值:
class CalculatorBrain: NSObject {
var weightLifted: Double
var repetitions: Double
var oneRepMax: Double?
var selectedFormula = CalculationFormula.Epley
init(weightLifted: Double, repetitions: Double) {
self.weightLifted = weightLifted
self.repetitions = repetitions
let userDefaults = NSUserDefaults.standardUserDefaults()
self.selectedFormula = userDefaults.objectForKey("selectedFormula") <-- error
}
self.selectedFormula行给出了一个错误:
'Cannot assign value of type 'AnyObject?' to type 'CalculationFormula'
经过大量搜索并阅读Apple文档后,我学到了很多关于UserDefaults和AnyObject的知识,但没有找到答案。
当我尝试将其作为Int:
时,我以为我做了self.selectedFormula = userDefaults.objectForKey("selectedFormula") as! Int
// 'Cannot assign value of type 'Int' to type 'CalculationFormula'
和
self.selectedFormula = userDefaults.objectForKey("selectedFormula") as Int
// 'Cannot convert value of type 'AnyObject?' to type 'Int' in coercion
我知道首选项值必须是这些类型之一(NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary),但我正在存储一个Int,所以我应该很好。
我只是被困住了,真的很感激一些帮助。拜托,谢谢你。
答案 0 :(得分:3)
自你的枚举
enum CalculationFormula: Int {
case Epley, Brzychi, Lander, Lombardi, MayhewEtAl, OConnerEtAl
}
扩展Int
您可以使用其rawValue
。因此,您可以从/ Int
读取/保存NSUserDefaults
。
func saveFormula(formula: CalculationFormula) {
NSUserDefaults.standardUserDefaults().setInteger(formula.rawValue, forKey: "selectedFormula")
}
func loadFormula() -> CalculationFormula? {
guard NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.contains("selectedFormula") else {
print("No value found")
return nil
}
guard let retrievedFormula = CalculationFormula(rawValue: NSUserDefaults.standardUserDefaults().integerForKey("selectedFormula")) else {
print("Wrong value found")
return nil
}
return retrievedFormula
}
答案 1 :(得分:1)
您必须使用rawValue
初始化枚举:
self.selectedFormula = CalculationFormula(rawValue: userDefaults.objectForKey("selectedFormula") as! Int)
答案 2 :(得分:0)
您应该将价值保存为:
userDefaults.setInteger(yourValue, forKey: "yourKey")
将您的值加载为:
userDefaults.integerForKey("yourKey") // Returns 0 if the value is nil.