2015-01-30 20 views
26

Ho un enum come questo:Come posso memorizzare un valore enum Swift in NSUserDefaults

enum Environment { 
    case Production 
    case Staging 
    case Dev 
} 

e mi piacerebbe per salvare un caso in NSUserDefaults come questo:

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

ho capito che un enum di Swift non è un NSObject, e questo rende difficile il salvataggio, ma non sono sicuro di quale sia il modo migliore per convertirlo in qualcosa di memorizzabile.

risposta

60

L'utilizzo di rawValue per l'enumerazione è un modo di utilizzare i tipi che possono essere memorizzati in NSUserDefaults, definire l'enum per utilizzare un valore raw. valori grezzi possono essere stringhe, caratteri o qualsiasi numero intero o in virgola mobile tipi di numero:

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

È inoltre possibile creare un'istanza enum direttamente utilizzando il rawValue (che potrebbe provenire da NSUserDefaults) come:

let env = Environment(rawValue: "Dev") 

è possibile estrarre il rawValue (String) dall'oggetto enum come questo e poi riporlo in NSUserDefaults se necessario:

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


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

E per chi cerca la lettura ... myenv = Ambiente (rawValue: defaults.stringForKey (kSavedEnvironmentDefaultsKey))! –

+1

Per chiunque abbia problemi con l'inizializzatore 'rawValue' o la proprietà sul tuo enum, assicurati che il tuo enum estenda il tipo di' rawValue'. Ad esempio, nell'esempio di OP, 'Environment' estende' String'. Mi è mancata la prima volta. –

+0

Dato che non si ha alcun controllo su ciò che è memorizzato nelle preferenze, è necessario verificare che defaults.stringForKey non sia nullo, e in tal caso o se l'Ambiente finisce nulla, sostituirlo con un valore predefinito. – gnasher729

4

Se si desidera salvare/leggere i dati fro m UserDefaults e separare una certa logica, si può fare in modo seguente (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) 
     } 
    } 
} 

Così il salvataggio dei dati in UserDefaults cercherà in questo modo:

UserDefaultsManager.shared.environment = Environment.Production 

E la lettura dei dati, salvati in UserDefaults in questo modo:

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

Sto usando come questo tipo di staging. Puoi per favore provarlo, ti aiuterà.

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") ?? "")") 
Problemi correlati