2016-08-29 6 views
0

関連する値を持つ列挙型をToday Extensionに渡したいと思います。NSUserDefaultsを使用しているので、列挙型が適合しないため、 AnyObjectへ。NSUserDefaults(Swift)に関連付けられた値を持つ列挙型を格納する

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

私はNSKeyedArchiverを使用しようとしましたが、AnyObjectに準拠する必要があります。

これを行う方法はありますか、関連する値を削除するだけですか?

おかげ

答えて

3

は、あなた自身のアーカイバを書きます。

これは、関連付けられた値を持つ列挙型を、ユーザーのデフォルトで直接保存できるプロパティリスト表現(辞書)に変換し、列挙型に戻すことができます。

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

ニース:)ありがとう、たくさん働いています – shannoga

関連する問題