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:
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)!
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]
Vous pouvez utiliser cette méthode facile
let dictSwift = ["key1": "value1", "key1": value2]
let dictNSMutable = NSMutableDictionary(dictionary: dictSwift)
Profitez de la programmation!
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
.