如何将 swift Dictionary 转换为 NSDictionary

Posted

技术标签:

【中文标题】如何将 swift Dictionary 转换为 NSDictionary【英文标题】:How do I convert swift Dictionary to NSDictionary 【发布时间】:2015-04-07 23:00:32 【问题描述】:

我正在尝试将 [String : String](Swift 字典)转换为 NSDictionary,以便以后在生成字符串的 JSON 库中使用

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)

但是let dict: NSDictionary = parcelDict 不起作用

let dict: NSDictionary = parcelDict as NSDictionary

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

所有这些示例都不起作用。它们产生以下错误:

正确的做法是什么?

更新:

有效的代码

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)!

【问题讨论】:

【参考方案1】:

你必须像这样投射它:

let dict = parcelDict as NSDictionary

否则 Swift Dictionary 和 NSDictionary 在用于 ex 的方法中的处理方式几乎相同:

func test(dict: NSDictionary) 

let dict = ["Test":1]
test(dict)

完全可以正常工作。


更新后

如果您将 Dictionary 值类型更改为非可选字符串,那么您的错误就会消失。

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

【讨论】:

你的字典不是 [String:String] 它是 [String:String?] 真的没有必要在字典中有一个可选的值,除非你想仍然有没有引用的键。 我的建议是您只需将值更改为字符串而不是字符串? 谢谢!你能更新你的答案吗?我会接受的 在我刚刚过滤了 [String:String] 字典的情况下对我不起作用。必须遍历 [String:String] 字典,放入新的可变 [NSObject:AnyObject] 字典进行转换。【参考方案2】:

你可以使用这个简单的方法

let dictSwift = ["key1": "value1", "key1": value2]

let dictNSMutable = NSMutableDictionary(dictionary: dictSwift)

享受编码!

【讨论】:

为我工作。谢谢【参考方案3】:

不需要将其转换为NSDictionary。只需使用:

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

在这篇文章中提到:Making a JSON object in Swift

编辑

从您的屏幕截图中,我相信您的问题在于您的 parcelDict 字典中的值类型。我可以使用以下代码重新创建错误:

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

但是,使用String 而不是String? 作为值类型可以消除错误。

因此,在填充 parcelDict 时,也许您应该只添加不是 nil 的值。

【讨论】:

以上是关于如何将 swift Dictionary 转换为 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 转换为 Swift Dictionary 以进行 HTTP POST

将 JSON 转换为 Dictionary Swift 时出错

将 JSON 响应转换为 Dictionary Swift

无法将“Swift.Array<Any>”类型的值转换为“Swift.Dictionary<Swift.String, Any>”

Swift 3 NSDictionary 到 Dictionary 的转换导致 NSInvalidArgumentException

如何在 Swift 中检索 NSURLRequest 的 HTTPBody 参数到 Dictionary: [NSObject: AnyObject]