web-dev-qa-db-ja.com

Swift辞書をNSDictionaryに変換する方法

文字列を生成する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

これらの例はすべて機能しません。次のエラーが発生します。

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

次のようにキャストする必要があります。

let dict = parcelDict as NSDictionary

それ以外の場合、Swift辞書とNSDictionaryは、exのメソッドで使用する場合とほぼ同じように扱われます。

func test(dict: NSDictionary) {}

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

完全に正常に動作します。


更新後

ディクショナリ値のタイプをオプションの文字列以外に変更すると、エラーはなくなります。

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

この簡単な方法を使用できます

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

let dictNSMutable = NSMutableDictionary(dictionary: dictSwift)

コーディングをお楽しみください!

8
Gopal Devra

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ではない値のみを追加する必要があります。

0
ABakerSmith