Как сохранить значение переименования Swift в NSUserDefaults
У меня есть перечисление вроде этого:
enum Environment {
case Production
case Staging
case Dev
}
И я хотел бы сохранить экземпляр в NSUserDefaults следующим образом:
func saveEnvironment(environment : Environment){
NSUserDefaults.standardUserDefaults().setObject(environment, forKey: kSavedEnvironmentDefaultsKey)
}
Я понимаю, что переименование Swift не является NSObject, и это затрудняет сохранение, но я не уверен, что лучший способ - преобразовать его в что-то, что можно сохранить.
Ответы
Ответ 1
Использование rawValue для перечисления является одним из способов использования типов, которые могут храниться в NSUserDefaults. Определите ваше перечисление для использования rawValue. Необработанные значения могут быть строками, символами или любыми типами целых чисел или чисел с плавающей точкой:
enum Environment: String {
case Production = "Prod"
case Staging = "Stg"
case Dev = "Dev"
}
Вы также можете создать экземпляр enum напрямую, используя rawValue (который может быть получен из NSUserDefaults), например:
let env = Environment(rawValue: "Dev")
Вы можете извлечь rawValue (String) из объекта enum следующим образом, а затем при необходимости сохранить его в NSUserDefaults:
if let myEnv = env {
println(myEnv.rawValue)
}
func saveEnvironment(environment : Environment){
NSUserDefaults.standardUserDefaults().setObject(environment.rawValue, forKey: kSavedEnvironmentDefaultsKey)
}
Ответ 2
Если вы хотите сохранить/прочитать данные из 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")
}
Ответ 3
Я использую как этот тип постановки. Можете ли вы попробовать это, это поможет вам.
enum Environment: String {
case Production = "Production URL"
case Testing = "Testing URl"
case Development = "Development URL"
}
//your button actions
// MARK: set Development api
@IBAction func didTapDevelopmentAction(_ sender: Any) {
let env = Environment.Development.rawValue
print(env)
UserDefaults.standard.set(env, forKey:Key.UserDefaults.stagingURL)
}
// MARK: set Production api
@IBAction func didTapProductionAction(_ sender: Any) {
let env = Environment.Production.rawValue
print(env)
UserDefaults.standard.set(env, forKey:Key.UserDefaults.stagingURL)
}
// MARK: set Testing api
@IBAction func didTapTestingAction(_ sender: Any) {
let env = Environment.Testing.rawValue
print(env)
UserDefaults.standard.set(env, forKey:Key.UserDefaults.stagingURL)
}
//Based on selection act
print("\(UserDefaults.standard.object(forKey: "stagingURL") ?? "")")