1

我正在尝试学习如何使用 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'

在对 SO 进行大量搜索并阅读 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,所以我应该在那里很好。

我只是卡住了,非常感谢一些帮助。谢谢,麻烦您了。

4

3 回答 3

3

因为你的枚举

enum CalculationFormula: Int {
    case Epley, Brzychi, Lander, Lombardi, MayhewEtAl, OConnerEtAl
}

扩展Int你可以使用它的rawValue. 因此,您可以读取/保存Intfrom/to 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
}
于 2016-05-21T23:18:22.633 回答
1

您必须使用以下方法初始化枚举rawValue

self.selectedFormula = CalculationFormula(rawValue: userDefaults.objectForKey("selectedFormula") as! Int)
于 2016-05-21T23:01:28.203 回答
0

您应该将您的价值保存为:

userDefaults.setInteger(yourValue, forKey: "yourKey")

将您的值加载为:

userDefaults.integerForKey("yourKey") // Returns 0 if the value is nil.
于 2016-05-21T23:18:53.877 回答