webentwicklung-frage-antwort-db.com.de

Wie konvertiere ich Swift Dictionary zu NSDictionary?

Ich versuche, einen [String : String] (ein schnelles Wörterbuch) in NSDictionary zu konvertieren, um ihn später in einer JSON-Bibliothek zu verwenden, die einen String erzeugt

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)

aber let dict: NSDictionary = parcelDict funktioniert nicht

let dict: NSDictionary = parcelDict as NSDictionary

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

Alle diese Beispiele funktionieren nicht. Sie erzeugen folgende Fehler:

enter image description here

enter image description here

Was ist der richtige Weg, dies zu tun?

Update:

Code, der funktioniert

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

Du musst es so besetzen: 

let dict = parcelDict as NSDictionary

Ansonsten werden das Swift Dictionary und das NSDictionary bei der Verwendung in Methoden für ex fast gleich behandelt:

func test(dict: NSDictionary) {}

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

Funktioniert einwandfrei.


Nach deinem Update

Wenn Sie Ihren Dictionary-Wertetyp in einen nicht optionalen String ändern, wird der Fehler behoben.

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

Sie können diese einfache Methode verwenden

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

let dictNSMutable = NSMutableDictionary(dictionary: dictSwift)

Viel Spaß beim Codieren!

5
Gopal Devra

Sie müssen es nicht in eine NSDictionary konvertieren. Benutz einfach:

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

Es wird in diesem Beitrag erwähnt: Erstellen eines JSON-Objekts in Swift

Bearbeiten

Von Ihren Screenshots aus glaube ich, dass Ihr Problem in dem Werttyp in Ihrem parcelDict-Wörterbuch liegt. Ich kann den Fehler mit dem folgenden Code erneut erstellen:

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

Wenn Sie jedoch eine String anstelle eines String? als Werttyp verwenden, wird der Fehler behoben.

Daher sollten Sie beim Auffüllen von parcelDict vielleicht nur Werte hinzufügen, die nicht nil sind.

0
ABakerSmith