webentwicklung-frage-antwort-db.com.de

NSDictionary zu NSData und NSData zu NSDictionary in Swift

Ich bin nicht sicher, ob ich das Wörterbuch oder das Datenobjekt oder beides falsch verwende. Ich versuche mich an den Wechsel zu Swift zu gewöhnen, aber ich habe ein wenig Probleme.

var dictionaryExample : [String:AnyObject] =
    ["user":"UserName",
     "pass":"password",
    "token":"0123456789",
    "image":0] // image should be either NSData or empty

let dataExample : NSData = dictionaryExample as NSData

Ich brauche das NSDictionary, um in ein NSData Objekt zu kodieren, sowie das NSData Objekt zu nehmen und es in ein NSDictionary zu dekodieren.

Jede Hilfe wird sehr geschätzt, danke.

50
IanTimmis

Sie können NSKeyedArchiver und NSKeyedUnarchiver verwenden

Beispiel für Swift 2.0+

var dictionaryExample : [String:AnyObject] = ["user":"UserName", "pass":"password", "token":"0123456789", "image":0]
let dataExample : NSData = NSKeyedArchiver.archivedDataWithRootObject(dictionaryExample)
let dictionary:NSDictionary? = NSKeyedUnarchiver.unarchiveObjectWithData(dataExample)! as? NSDictionary

Swift3.0

let dataExample: Data = NSKeyedArchiver.archivedData(withRootObject: dictionaryExample)
let dictionary: Dictionary? = NSKeyedUnarchiver.unarchiveObject(with: dataExample) as! [String : Any]

Screenshot des Spielplatzes

enter image description here

109
Leo

NSPropertyListSerialization kann eine alternative Lösung sein.

// Swift Dictionary To Data.
var data = try NSPropertyListSerialization.dataWithPropertyList(dictionaryExample, format: NSPropertyListFormat.BinaryFormat_v1_0, options: 0)

// Data to Swift Dictionary
var dicFromData = (try NSPropertyListSerialization.propertyListWithData(data, options: NSPropertyListReadOptions.Immutable, format: nil)) as! Dictionary<String, AnyObject>
9
yuyeqingshan

Für Swift 3:

let data = try PropertyListSerialization.data(fromPropertyList: authResponse, format: PropertyListSerialization.PropertyListFormat.binary, options: 0)
3
ingconti

Leos Antwort gab mir Fehler bei der Erstellung, da NSData nicht mit Data identisch ist. Die Funktion unarchiveObject(with:) nimmt eine Variable vom Typ Data an, während die Funktion unarchiveTopLevelObjectWithData() eine Variable vom Typ NSData annimmt.

Dies ist eine funktionierende Swift 3 Antwort:

var names : NSDictionary = ["name":["John Smith"], "age": 35]
let namesData : NSData = NSKeyedArchiver.archivedData(withRootObject: names) as NSData
do{
    let backToNames = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(namesData) as! NSDictionary
    print(backToNames)
}catch{
    print("Unable to successfully convert NSData to NSDictionary")
}
3
Ujjwal-Nadhani