web-dev-qa-db-fra.com

NSDictionary to NSData et NSData to NSDictionary dans Swift

Je ne suis pas sûr si j'utilise le dictionnaire ou l'objet de données ou les deux de manière incorrecte. J'essaie de m'habituer au passage à Swift mais j'ai un petit problème.

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

Il me faut le NSDictionary pour encoder un objet NSData et prendre cet objet NSData et le décoder en un NSDictionary.

Toute aide est grandement appréciée, merci.

50
IanTimmis

Vous pouvez utiliser NSKeyedArchiver et NSKeyedUnarchiver

Exemple pour 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]

Capture d'écran du terrain de jeu

enter image description here

109
Leo

NSPropertyListSerialization peut être une solution alternative.

// 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

Pour Swift 3:

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

La réponse de Leo m'a donné des erreurs de temps de construction parce que NSData n'est pas la même chose que Data. La fonction unarchiveObject(with:) prend une variable de type Data, alors que la fonction unarchiveTopLevelObjectWithData() prend une variable de type NSData.

Ceci est une réponse active Swift 3 :

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