我正在尝试将[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)!
答案 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
的值。