2016-08-29 6 views
0

Ich möchte Enums mit zugeordneten Werten an eine Today Extension übergeben, da ich NSUserDefaults dafür verwende, scheint es, dass es keine direkte Möglichkeit gibt, dies zu tun, da Enum nicht konform ist zu AnyObject.Store Enum mit verknüpften Werten in NSUserDefaults (Swift)

enum DeepLinkAction { 
    case StartPractice(lessonName:String) 
    case StartTest 
    case Letters(didComplete:Bool, iconURL:String) 
} 

Ich versuchte NSKeyedArchiver mit aber erfordert ANYOBJECT entspricht.

Gibt es eine Möglichkeit, das zu tun, oder sollte ich nur die zugehörigen Werte entfernen?

Dank

Antwort

3

Schreiben Sie Ihre eigene Archivierungs.

Dadurch wird die Enumeration mit den zugehörigen Werten in eine Eigenschaftslistenrepräsentation (ein Dictionary) konvertiert, die direkt in Benutzerstandardeinstellungen gespeichert und wieder in den Enum-Typ konvertiert werden kann.

enum DeepLinkAction { 
    case StartPractice(lessonName:String) 
    case StartTest 
    case Letters(didComplete:Bool, iconURL:String) 

    var propertyListRepresentation : [String:AnyObject] { 
    switch self { 
    case .StartPractice(let lessonName) : return ["StartPractice" : lessonName] 
    case .StartTest : return ["StartTest" : ""] 
    case .Letters(let complete, let iconURL) : return ["Letters" : [complete, iconURL]] 
    } 
    } 

    init(propertyList: [String:AnyObject]) { 
    assert(!propertyList.isEmpty, "property list must contain one key") 
    let key = propertyList.keys.first! 
    let value = propertyList[key]! 
    switch key { 
    case "StartPractice": self = .StartPractice(lessonName: value as! String) 
    case "Letters": 
     let parameters = value as! [AnyObject] 
     self = .Letters(didComplete: parameters[0] as! Bool, iconURL: parameters[1] as! String) 

    default: self = .StartTest 
    } 

    } 
} 

let action = DeepLinkAction.Letters(didComplete: false, iconURL: "http://myServer.com/path") 
let plist = action.propertyListRepresentation // ["Letters": [0, "http://myServer.com/path"]] 

let action2 = DeepLinkAction(propertyList: plist) 
+0

Schön :) Vielen Dank, es funktioniert super – shannoga