How do I convert NSDictionary to Dictionary?

david picture david · Nov 1, 2016 · Viewed 20.5k times · Source

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 <code>as!</code> 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 <code>as!</code> 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 <code>as!</code> to force downcast?

Answer

vadian picture vadian · Nov 1, 2016
  • 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