web-dev-qa-db-fra.com

Comment convertir un dictionnaire Swift en NSDictionary

J'essaie de convertir un [String : String] (un dictionnaire Swift) en NSDictionary pour une utilisation ultérieure dans une bibliothèque JSON produisant une chaîne.

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)

mais let dict: NSDictionary = parcelDict ne fonctionne pas

let dict: NSDictionary = parcelDict as NSDictionary

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

Tous ces exemples ne fonctionnent pas. Ils produisent les erreurs suivantes:

enter image description here

enter image description here

Quelle est la bonne façon de le faire?

Mettre à jour:

Code qui fonctionne

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

Vous devez le lancer comme ceci: 

let dict = parcelDict as NSDictionary

Sinon, le dictionnaire Swift et NSDictionary sont traités presque de la même manière lorsqu’ils sont utilisés dans des méthodes pour ex:

func test(dict: NSDictionary) {}

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

Travaillera complètement bien.


Après votre mise à jour

Si vous modifiez le type de valeur de votre dictionnaire en chaîne non facultative, votre erreur disparaîtra.

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

Vous pouvez utiliser cette méthode facile

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

let dictNSMutable = NSMutableDictionary(dictionary: dictSwift)

Profitez de la programmation!

5
Gopal Devra

Il n'est pas nécessaire de le convertir en NSDictionary. Il suffit d'utiliser:

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

C'est mentionné dans ce post: Créer un objet JSON dans Swift

Modifier

D'après vos captures d'écran, votre problème réside dans le type de valeur de votre dictionnaire parcelDict. Je peux recréer l'erreur avec le code suivant:

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

Toutefois, l'utilisation de String au lieu de String? en tant que type de valeur supprime l'erreur.

Par conséquent, lors du remplissage de parcelDict, vous ne devriez peut-être y ajouter que des valeurs qui ne sont pas nil.

0
ABakerSmith