Подтвердить что ты не робот

Как сохранить значение переименования Swift в NSUserDefaults

У меня есть перечисление вроде этого:

enum Environment {
    case Production
    case Staging
    case Dev
}

И я хотел бы сохранить экземпляр в NSUserDefaults следующим образом:

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

Я понимаю, что переименование Swift не является NSObject, и это затрудняет сохранение, но я не уверен, что лучший способ - преобразовать его в что-то, что можно сохранить.

4b9b3361

Ответ 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") ?? "")")