Подтвердить что ты не робот

NSDictionary для NSData и NSData для NSDictionary в Swift

Я не уверен, использую ли я словарь или объект данных или оба неправильно. Я пытаюсь привыкнуть к переключателю, чтобы быстро, но у меня небольшие проблемы.

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

Мне нужно NSDictionary, чтобы закодировать объект NSData, а также взять этот объект NSData и декодировать его в NSDictionary.

Любая помощь очень ценится, спасибо.

4b9b3361

Ответ 1

Вы можете использовать NSKeyedArchiver и NSKeyedUnarchiver

Пример для быстрого 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]

Снимок экрана детской площадки

введите описание изображения здесь

Ответ 2

NSPropertyListSerialization может быть альтернативным решением.

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

Ответ 3

Leo answer дал мне ошибки времени сборки, потому что NSData не совпадает с Data. Функция unarchiveObject(with:) принимает переменную типа Data, тогда как функция unarchiveTopLevelObjectWithData() принимает переменную типа NSData.

Это рабочий 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")
}

Ответ 4

Для Swift 3:

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