2015-04-07 16 views
6

Ich versuche, eine [String : String] (ein Swift Dictionary) zu NSDictionary, für die spätere Verwendung auf einer JSON-Bibliothek zu konvertieren, die einen StringWie kann ich swift Wörterbuch zu NSDictionary konvertieren

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 produziert

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 produzieren die folgenden Fehler:

enter image description here

enter image description here

Was ist der richtige Weg, es zu tun?

Update:

Code, der

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

Antwort

9

Sie haben zu werfen es wie folgt funktioniert:

let dict = parcelDict as NSDictionary 

Ansonsten ist der Swift-Wörterbuch und NSDictionary sind fast die gleiche Art und Weise behandelt werden, wenn Verwenden Sie es in Methoden für ex:

func test(dict: NSDictionary) {} 

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

Wird vollständig funktionieren.


Nach dem Update

Wenn Sie Ihr Wörterbuch Wert Typ nicht optional String ändern dann Ihre Fehler verschwinden.

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

Ihr Wörterbuch ist kein [String: Zeichenkette] its a [Zeichenkette: Zeichenkette?] – Arbitur

+0

Es ist nicht wirklich notwendig, einen optionalen Wert in einem Dictionary zu haben, es sei denn, Sie möchten immer noch den Schlüssel haben, der auf nichts verweist . – Arbitur

+0

Mein Vorschlag ist, ändern Sie einfach den Wert in String statt String? – Arbitur

0

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

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

Es ist in diesem Beitrag erwähnt: Making a JSON object in Swift

bearbeiten

Von Ihrem Screenshots glaube ich Ihr Problem in Ihrem parcelDict Wörterbuch im Werttyp liegt. Ich kann den Fehler mit dem folgenden Code erstellen:

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

jedoch mit einem String anstelle eine String? als der Werttyp der Fehler beseitigt.

Wenn Sie also parcelDict ausfüllen, sollten Sie nur Werte hinzufügen, die nicht sind.

1

können Sie diese einfache Methode verwenden

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

let dictNSMutable = NSMutableDictionary(dictionary: dictSwift) 

Genießen Codierung!

Verwandte Themen