Search code examples
swiftdictionarynsdictionaryobjective-c-swift-bridge

How do I convert NSDictionary to Dictionary?


I have already updated to Xcode 8 and now I need to convert my code from Swift 2 to Swift 3.

Before, when I want to convert NSDictionary to Dictionary, I just wrote the following:

let post_paramsValue = post_params as? Dictionary<String,AnyObject?>

where post_params is NSDictionary.

But now with Swift 3, I am receiving this error:

NSDictionary is not convertible to Dictionary

Why? What's changed?


Edit 1

I've also tried the following:

let post_paramsValue = post_params as Dictionary<String,Any>

But that gives this error:

'NSDictionary!' is not convertible to 'Dictionary<String, Any>'; did you mean to use as! to force downcast?


Edit 2

I've also tried the following:

let post_paramsValue =  post_params as Dictionary<String,Any>

Where I declare NSDictionary instead of NSDictionary!, but it doesn't work; I got this error:

'NSDictionary' is not convertible to 'Dictionary<String, Any>'; did you mean to use as! to force downcast?


Edit 3

I've also tried the following:

let post_paramsValue =  post_params as Dictionary<String,Any>!

But I received this error:

'NSDictionary!' is not convertible to 'Dictionary<String, Any>!'; did you mean to use as! to force downcast?


Solution

    • NSDictionary in Objective-C has always non-optional values.
    • AnyObject has become Any in Swift 3.
    • Considering the first two "rules" NSDictionary can be bridge cast to Dictionary

    let post_paramsValue = post_params as Dictionary<String,Any>
    

    If the source NSDictionary is an optional you might use as Dictionary<String,Any>? or as? Dictionary<String,Any> or as! Dictionary<String,Any> or as Dictionary<String,Any>! depending on the actual type of the NSDictionary