2015-01-30 25 views
26

Tôi có một enum như thế này:Làm thế nào tôi có thể lưu trữ một giá trị enum Swift trong NSUserDefaults

enum Environment { 
    case Production 
    case Staging 
    case Dev 
} 

Và tôi muốn lưu một thể hiện trong NSUserDefaults như thế này:

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

Tôi hiểu rằng một enum Swift không phải là một NSObject, và mà làm cho nó khó khăn để tiết kiệm, nhưng tôi không chắc chắn cách tốt nhất là để chuyển đổi nó để một cái gì đó có thể lưu trữ.

Trả lời

60

Sử dụng rawValue cho enum là một cách sử dụng các loại có thể được lưu trữ trong NSUserDefaults, xác định enum của bạn để sử dụng rawValue. giá trị nguyên có thể chuỗi, ký tự, hoặc bất kỳ số nguyên hoặc các loại số dấu chấm động:

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

Bạn cũng có thể tạo ra một thể hiện enum trực tiếp bằng cách sử dụng rawValue (mà có thể đến từ NSUserDefaults) như:

let env = Environment(rawValue: "Dev") 

bạn có thể trích xuất các rawValue (string) từ đối tượng enum như thế này và sau đó lưu nó trong NSUserDefaults nếu cần thiết:

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


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

Và đối với những người đang tìm đọc ... myEnv = Môi trường (rawValue: defaults.stringForKey (kSavedEnvironmentDefaultsKey))! –

+1

Đối với bất kỳ ai gặp sự cố với trình khởi tạo 'rawValue' hoặc thuộc tính trên enum của bạn, hãy đảm bảo rằng enum của bạn mở rộng loại' rawValue' của bạn. Ví dụ, trong ví dụ của OP, 'Environment' mở rộng' String'. Tôi đã bỏ lỡ lần đầu tiên này. –

+0

Vì bạn không có quyền kiểm soát những gì được lưu trữ trong sở thích, bạn nên kiểm tra mặc định. StringForKey không phải là nil, và trong trường hợp đó hoặc nếu Môi trường kết thúc bằng 0 thay thế bằng giá trị mặc định. – gnasher729

4

Nếu bạn muốn lưu/đọc dữ liệu fro m UserDefaults và tách một số logic, bạn có thể làm điều đó trong cách sau (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) 
     } 
    } 
} 

Vì vậy, tiết kiệm dữ liệu trong UserDefaults sẽ xem xét theo cách này:

UserDefaultsManager.shared.environment = Environment.Production 

Và đọc dữ liệu, lưu trong UserDefaults theo cách này:

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

Tôi đang sử dụng loại dàn dựng này. Bạn có thể vui lòng thử điều này nó sẽ giúp bạn.

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") ?? "")") 
Các vấn đề liên quan