NSDictionary to NSData and NSData to NSDictionary in Swift

前端 未结 6 1436
故里飘歌
故里飘歌 2020-12-12 23:54

I am not sure if I am using the dictionary or the data object or both incorrectly. I m trying to get used to the switch to swift but I\'m having a little trouble.

         


        
相关标签:
6条回答
  • 2020-12-13 00:14

    For Swift 3:

    let data = try PropertyListSerialization.data(fromPropertyList: authResponse, format: PropertyListSerialization.PropertyListFormat.binary, options: 0)
    
    0 讨论(0)
  • 2020-12-13 00:15

    You can use NSKeyedArchiver and NSKeyedUnarchiver

    Example for 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 of playground

    0 讨论(0)
  • 2020-12-13 00:18

    Leo's answer gave me build time errors because NSData isn't the same as Data. The function unarchiveObject(with:) takes a variable of type Data, whereas the function unarchiveTopLevelObjectWithData() takes a variable of type NSData.

    This is a working Swift 3 answer:

    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")
    }
    
    0 讨论(0)
  • 2020-12-13 00:25

    NSPropertyListSerialization may be an alternative solution.

    // 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>
    
    0 讨论(0)
  • 2020-12-13 00:25

    For Swift 4 -

    let dictionaryExample : [String:AnyObject] = ["user":"UserName" as AnyObject, "pass":"password" as AnyObject, "token":"0123456789" as AnyObject, "image":0 as AnyObject]
        let dataExample : NSData = NSKeyedArchiver.archivedData(withRootObject: dictionaryExample) as NSData
        let dictionary:NSDictionary? = NSKeyedUnarchiver.unarchiveObject(with: dataExample as Data)! as? NSDictionary
    
    0 讨论(0)
  • 2020-12-13 00:33

    Swift 5

    as @yuyeqingshan said, PropertyListSerialization is a good option

           // Swift Dictionary To Data.
            do {
                let data = try PropertyListSerialization.data(fromPropertyList: [:], format: PropertyListSerialization.PropertyListFormat.binary, options: 0)
                // do sth
            } catch{
                print(error)
            }
    
    
            // Data to Swift Dictionary
            do {
                let dicFromData = try PropertyListSerialization.propertyList(from: data, options: PropertyListSerialization.ReadOptions.mutableContainers, format: nil)
                if let dict = dicFromData as? [String: Any]{
                    // do sth
                }
            } catch{
                print(error)
            }
    
    0 讨论(0)
提交回复
热议问题