17

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

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

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

post_params在哪里NSDictionary

但是现在使用 Swift 3,我收到了这个错误:

NSDictionary is not convertible to Dictionary

为什么?有什么改变?


编辑 1

我还尝试了以下方法:

let post_paramsValue = post_params as Dictionary<String,Any>

但这给出了这个错误:

“NSDictionary!”  不能转换为 'Dictionary<String, Any>'; 您的意思是使用 <code>as!</code> 强制向下转换吗?


编辑 2

我还尝试了以下方法:

let post_paramsValue =  post_params as Dictionary<String,Any>

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

'NSDictionary' 不能转换为 'Dictionary<String, Any>'; 您的意思是使用 <code>as!</code> 强制向下转换吗?


编辑 3

我还尝试了以下方法:

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

但我收到了这个错误:

“NSDictionary!”  不能转换为 'Dictionary<String, Any>!';  您的意思是使用 <code>as!</code> 强制向下转换吗?

4

3 回答 3

18
  • NSDictionary在 Objective-C 中总是有非可选值。
  • AnyObject已成为AnySwift 3。
  • 考虑到前两个“规则”NSDictionary可以桥接Dictionary

let post_paramsValue = post_params as Dictionary<String,Any>

如果源NSDictionary是可选的,您可以使用as Dictionary<String,Any>?oras? Dictionary<String,Any>as! Dictionary<String,Any>oras Dictionary<String,Any>!取决于实际类型NSDictionary

于 2016-11-01T10:53:44.273 回答
2

对于那些有问题的人NSDictionary,只需使用这个扩展:

斯威夫特 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
    }
}
于 2017-09-20T14:10:55.540 回答
0

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

例如:在 swift 界面中NSDictionary<NSString *, NSString*>自动翻译成[String: String]

于 2020-03-24T12:05:08.940 回答