How do I convert swift Dictionary to NSDictionary

I’m trying to convert a [String : String] (a Swift Dictionary) to NSDictionary, for later use on a JSON library that produces a string

var parcelDict = ["trackingNumber" : parcel.number,
                  "dstCountry" : parcel.countryCode];

if (parcel.postalService != nil) 
{
    parcelDict["postalService"] = parcel.postalService;
}

var errorPtr: NSErrorPointer
let dict: NSDictionary = parcelDict
var data = NSJSONSerialization.dataWithJSONObject(dict, options:0, error: errorPtr) as NSData

return NSString(data: data, encoding: NSUTF8StringEncoding)

but let dict: NSDictionary = parcelDict does not work

  • Array from dictionary keys in swift
  • UICollectionView contentOffset changes with custom layout
  • How can you reload a ViewController after dismissing a modally presented view controller in Swift?
  • When my app enters foreground, view is not reloaded with refresh data
  • core data “Can't find model for source store”;
  • Animate a UIView along an arc
  • let dict: NSDictionary = parcelDict as NSDictionary
    
    var data = NSJSONSerialization.dataWithJSONObject(parcelDict as NSMutableDictionary, options:0, error: errorPtr) as NSData
    

    All of these examples do not work. They produce the following errors:

    enter image description here

    enter image description here

    What’s the correct way of doing it?

    Update:

    Code that works

    var parcelDict = ["trackingNumber" : parcel.number!,
                      "dstCountry" : parcel.countryCode!];
    
    if (parcel.postalService != nil) {
        parcelDict["postalService"] = parcel.postalService;
    }
    
    var jsonError : NSError?
    let dict = parcelDict as NSDictionary
    var data = NSJSONSerialization.dataWithJSONObject(dict, options:nil, error: &jsonError)
    return NSString(data: data!, encoding: NSUTF8StringEncoding)!
    

    3 Solutions Collect From Internet About “How do I convert swift Dictionary to NSDictionary”

    You have to cast it like this:

    let dict = parcelDict as NSDictionary
    

    Otherwise the Swift Dictionary and NSDictionary are treated almost the same way when using it in methods for ex:

    func test(dict: NSDictionary) {}
    
    let dict = ["Test":1]
    test(dict)
    

    Will work completely fine.


    After your update

    If you change your Dictionary value type to non optional String then your error will go away.

    [String:String?] change to -> [String:String]
    

    Don’t don’t need to convert it to an NSDictionary. Just use:

    var data = NSJSONSerialization.dataWithJSONObject(parcelDict, options:0, error: errorPtr) as NSData
    

    It’s mentioned in this post: Making a JSON object in Swift

    Edit

    From your screenshots I believe your problem lies in the value type in your parcelDict Dictionary. I can recreate the error with the following code:

    let dict = [String: String?]()
    let nsDict = dict as NSDictionary // [String: String?] is not convertible to NSDictionary
    

    However, using a String instead of a String? as the value type removes the error.

    Therefore, when populating parcelDict perhaps you should only add to it values which are not nil.

    You can use this easy method

    let dictSwift = ["key1": "value1", "key1": value2]
    
    let dictNSMutable = NSMutableDictionary(dictionary: dictSwift)
    

    Enjoy coding!