如何将swift Dictionary转换为NSDictionary

时间:2015-04-07 23:00:32

标签: ios swift nsdictionary

我正在尝试将[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

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

enter image description here

enter image description here

这样做的正确方法是什么?

更新

有效的代码

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

3 个答案:

答案 0 :(得分:16)

你必须像这样投射:

let dict = parcelDict as NSDictionary

否则Swift Dictionary和NSDictionary在以下方法中使用它时的处理方式几乎相同:

func test(dict: NSDictionary) {}

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

完全可以正常工作。


更新后

如果您将词典值类型更改为非可选字符串,则您的错误将消失。

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

答案 1 :(得分:7)

您可以使用这种简单的方法

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

let dictNSMutable = NSMutableDictionary(dictionary: dictSwift)

享受编码!

答案 2 :(得分:0)

不需要将其转换为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的值。