2015-04-07 15 views
6

Sto cercando di convertire una (un Dizionario Swift) [String : String]-NSDictionary, per un uso successivo su una libreria JSON che produce una stringaCome faccio a convertire rapido dizionario per 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) 

ma let dict: NSDictionary = parcelDict non funziona

let dict: NSDictionary = parcelDict as NSDictionary 

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

Tutti questi esempi non funzionano. Essi producono i seguenti errori:

enter image description here

enter image description here

Qual è il modo corretto di farlo?

Aggiornamento:

codice che funziona

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

risposta

9

Bisogna lanciare in questo modo:

let dict = parcelDict as NSDictionary 

caso contrario, il dizionario Swift e NSDictionary sono trattati quasi allo stesso modo in cui utilizzandolo in metodi per esempio:

func test(dict: NSDictionary) {} 

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

Funzionerà perfettamente.


Dopo l'aggiornamento

Se si cambia il tipo di valore di dizionario stringa non opzionale allora il vostro errore andrà via.

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

Il tuo dizionario non è [String: String] its a [String: String?] – Arbitur

+0

Non c'è davvero alcun bisogno di avere un valore opzionale in un dizionario, a meno che tu non voglia avere ancora la chiave che non si riferisce a nulla . – Arbitur

+0

Il mio suggerimento è basta cambiare il valore in String invece che in String? – Arbitur

0

Non è necessario convertirlo in un NSDictionary. Basta usare:

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

E 'citato in questo post: Making a JSON object in Swift

Modifica

Da tuo screenshot Credo che il problema risiede nel tipo di valore nella vostra parcelDict dizionario. Posso ricreare l'errore con il seguente codice:

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

Tuttavia, utilizzando un String invece di un String? come il tipo di valore rimuove l'errore.

Pertanto, se si utilizza lo parcelDict, è possibile aggiungere solo valori che non sono nil.

1

È possibile utilizzare questo metodo facile

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

let dictNSMutable = NSMutableDictionary(dictionary: dictSwift) 

Godetevi codifica!