文字列を生成するJSONライブラリで後で使用するために、[String : String]
(a Swift Dictionary)をNSDictionary
に変換しようとしています。
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)!
次のようにキャストする必要があります。
let dict = parcelDict as NSDictionary
それ以外の場合、Swift辞書とNSDictionaryは、exのメソッドで使用する場合とほぼ同じように扱われます。
func test(dict: NSDictionary) {}
let dict = ["Test":1]
test(dict)
完全に正常に動作します。
更新後
ディクショナリ値のタイプをオプションの文字列以外に変更すると、エラーはなくなります。
[String:String?] change to -> [String:String]
この簡単な方法を使用できます
let dictSwift = ["key1": "value1", "key1": value2]
let dictNSMutable = NSMutableDictionary(dictionary: dictSwift)
コーディングをお楽しみください!
NSDictionary
に変換する必要はありません。ただ使う:
var data = NSJSONSerialization.dataWithJSONObject(parcelDict, options:0, error: errorPtr) as NSData
それはこの投稿で言及されています: SwiftでJSONオブジェクトを作成する
編集
スクリーンショットから、問題はparcelDict
辞書の値のタイプにあると思います。次のコードでエラーを再現できます。
let dict = [String: String?]()
let nsDict = dict as NSDictionary // [String: String?] is not convertible to NSDictionary
ただし、値のタイプとしてString?
の代わりにString
を使用すると、エラーが削除されます。
したがって、parcelDict
に入力する場合、nil
ではない値のみを追加する必要があります。