tutorial - the swift programming language




如何在NSUserDefaults中存储Swift枚举值 (2)

我有这样的枚举:

enum Environment {
    case Production
    case Staging
    case Dev
}

我想在NSUserDefaults中保存一个像这样的实例:

func saveEnvironment(environment : Environment){
    NSUserDefaults.standardUserDefaults().setObject(environment, forKey: kSavedEnvironmentDefaultsKey)
}

我知道Swift enum不是NSObject,这使得它很难保存,但我不确定将它转换为可存储的东西的最佳方法是什么。


使用rawValue作为枚举是使用可以存储在NSUserDefaults中的类型的一种方法,定义你的枚举以使用rawValue。 原始值可以是字符串,字符或任何整数或浮点数类型:

enum Environment: String {
    case Production = "Prod"
    case Staging    = "Stg"
    case Dev        = "Dev"
}

您还可以使用rawValue(可能来自NSUserDefaults)直接创建枚举实例,如:

 let env = Environment(rawValue: "Dev")

您可以像这样从枚举对象中提取rawValue(String),然后在需要时将其存储在NSUserDefaults中:

if let myEnv = env {
    println(myEnv.rawValue)
}


func saveEnvironment(environment : Environment){
    NSUserDefaults.standardUserDefaults().setObject(environment.rawValue, forKey: kSavedEnvironmentDefaultsKey)
}

如果您想保存/读取UserDefaults中的数据并分离一些逻辑,您可以通过以下方式执行此操作(Swift 3):

enum Environment: String {
    case Production
    case Staging
    case Dev
}

class UserDefaultsManager {

    static let shared = UserDefaultsManager()

    var environment: Environment? {
       get {
           guard let environment = UserDefaults.standard.value(forKey: kSavedEnvironmentDefaultsKey) as? String else {
               return nil
           }
           return Environment(rawValue: environment)
       }
       set(environment) {
           UserDefaults.standard.set(environment?.rawValue, forKey: kSavedEnvironmentDefaultsKey)
       }
    }
}

因此,在UserDefaults中保存数据将是这样的:

UserDefaultsManager.shared.environment = Environment.Production

并以这种方式读取保存在UserDefaults中的数据:

if let environment = UserDefaultsManager.shared.environment {
    //you can do some magic with this variable
} else {
    print("environment data not saved in UserDefaults")
}




swift