我有这样的枚举:
enum Environment {
case Production
case Staging
case Dev
}
Run Code Online (Sandbox Code Playgroud)
我想在NSUserDefaults中保存一个像这样的实例:
func saveEnvironment(environment : Environment){
NSUserDefaults.standardUserDefaults().setObject(environment, forKey: kSavedEnvironmentDefaultsKey)
}
Run Code Online (Sandbox Code Playgroud)
我知道Swift枚举不是NSObject,这使得它很难保存,但我不确定将它转换为可存储的东西的最佳方法是什么.
use*_*374 74
使用rawValue作为枚举是使用可以存储在NSUserDefaults中的类型的一种方法,定义你的枚举以使用rawValue.原始值可以是字符串,字符或任何整数或浮点数类型:
enum Environment: String {
case Production = "Prod"
case Staging = "Stg"
case Dev = "Dev"
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用rawValue(可能来自NSUserDefaults)直接创建枚举实例,如:
let env = Environment(rawValue: "Dev")
Run Code Online (Sandbox Code Playgroud)
您可以像这样从枚举对象中提取rawValue(String),然后根据需要将其存储在NSUserDefaults中:
if let myEnv = env {
println(myEnv.rawValue)
}
func saveEnvironment(environment : Environment){
NSUserDefaults.standardUserDefaults().setObject(environment.rawValue, forKey: kSavedEnvironmentDefaultsKey)
}
Run Code Online (Sandbox Code Playgroud)
mkk*_*lik 18
如果您想保存/读取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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在UserDefaults中保存数据将是这样的:
UserDefaultsManager.shared.environment = Environment.Production
Run Code Online (Sandbox Code Playgroud)
并以这种方式读取保存在UserDefaults中的数据:
if let environment = UserDefaultsManager.shared.environment {
//you can do some magic with this variable
} else {
print("environment data not saved in UserDefaults")
}
Run Code Online (Sandbox Code Playgroud)
Codable
协议Environment
符合Codable
协议的范围枚举将值编码和解码为Data
.
enum Environment: String, Codable {
case Production
case Staging
case Dev
}
Run Code Online (Sandbox Code Playgroud)
包装器UserDefaults
:
struct UserDefaultsManager {
static var userDefaults: UserDefaults = .standard
static func set<T>(_ value: T, forKey: String) where T: Encodable {
if let encoded = try? JSONEncoder().encode(value) {
userDefaults.set(encoded, forKey: forKey)
}
}
static func get<T>(forKey: String) -> T? where T: Decodable {
guard let data = userDefaults.value(forKey: forKey) as? Data,
let decodedData = try? JSONDecoder().decode(T.self, from: data)
else { return nil }
return decodedData
}
}
Run Code Online (Sandbox Code Playgroud)
// Set
let environment: Environment = .Production
UserDefaultsManager.set(environment, forKey: "environment")
// Get
let environment: Environment? = UserDefaultsManager.get(forKey: "environment")
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17078 次 |
最近记录: |