如何将 NSDictionary 转换为字典?

How do I convert NSDictionary to Dictionary?

我已经更新到 XCode 8,现在我需要将我的代码从 Swift 2 转换为 Swift 3。

之前,当我想将NSDictionary转换为Dictionary时,我只是写了以下内容:

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

其中 post_paramsNSDictionary

但现在使用 Swift 3,我收到此错误:

NSDictionary is not convertible to Dictionary

为什么?有什么变化?


编辑 1

我也试过以下方法:

let post_paramsValue = post_params as Dictionary<String,Any>

但是这给出了这个错误:


编辑 2

我也试过以下方法:

let post_paramsValue =  post_params as Dictionary<String,Any>

我在哪里声明 NSDictionary 而不是 NSDictionary!,但它不起作用;我收到此错误:


编辑 3

我也试过以下方法:

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

但是我收到了这个错误:

  • NSDictionary in Objective-C 始终具有非可选值。
  • AnyObject 在 Swift 中变成了 Any 3.
  • 考虑到前两个 "rules" NSDictionary 可以桥接为 Dictionary

let post_paramsValue = post_params as Dictionary<String,Any>

如果源 NSDictionary 是可选的,您可以使用 as Dictionary<String,Any>?as? Dictionary<String,Any>as! Dictionary<String,Any>as Dictionary<String,Any>!,具体取决于 NSDictionary

对于 NSDictionary 有问题的人,只需使用此扩展程序:

Swift 3.0

extension NSDictionary {
    var swiftDictionary: Dictionary<String, Any> {
        var swiftDictionary = Dictionary<String, Any>()

        for key : Any in self.allKeys {
            let stringKey = key as! String
            if let keyValue = self.value(forKey: stringKey){
                swiftDictionary[stringKey] = keyValue
            }
        }

        return swiftDictionary
    }
}

您只需要在 objc 中正确声明 NSDictionary

例如:NSDictionary<NSString *, NSString*> 在 swift 接口

中自动转换为 [String: String]