web-dev-qa-db-fra.com

le transtypage de [String: AnyObject] vers un type non lié NSMutableDictionary échoue toujours Avertissement

Le code fonctionne, mais comment puis-je faire taire cet avertissement qui continue d'apparaître à chaque fois?

let parentView = self.parentViewController as! SBProfileViewController
parentView.savedDetailsModel = SBSavedUserModel(data:responseObject["data"].dictionaryObject! as! NSMutableDictionary)

le transtypage de '[String: AnyObject]' vers un type non lié 'NSMutableDictionary' échoue toujours Avertissement 

SavedUserModel stocke les informations enregistrées: -

class SBSavedUserModel : NSObject { 
var userId : String!
var firstName : String!
var lastName : String!
var imageBase64 : String!

required init ( data : NSMutableDictionary) {
    self.userId =  data.objectForKey("userId") as! String
    self.firstName = data.objectForKey("fName") as! String
    self.lastName = data.objectForKey("lName") as! String
    self.imageBase64 = data.objectForKey("image") as! String
}
7
Jitendra

Essayez de remplacer

responseObject["data"].dictionaryObject! as! NSMutableDictionary

avec ça:

NSMutableDictionary(dictionary: responseObject["data"].dictionaryObject!)

Vous pouvez facilement le transformer en un NSDictionary, mais pour une raison quelconque, si vous souhaitez un NSMutableDictionary, vous devez en initialiser un nouveau avec NSMutableDictionary(dictionary:).

Edit : voir le commentaire de cette question par @Tommy sur la raison pour laquelle cela est nécessaire.

4
Addison

Contrairement à NSArray et NSDictionary, les types de collection mutables FoundationNSMutableArray et NSMutableDictionary ne sont pas pontés vers leurs équivalents Swift.

La solution la plus simple est de continuer à utiliser les types natifs Swift

let parentView = self.parentViewController as! SBProfileViewController
parentView.savedDetailsModel = SBSavedUserModel(data:responseObject["data"].dictionaryObject!)

...

class SBSavedUserModel : NSObject { 
var userId, firstName, lastName, imageBase64 : String

  required init ( data : [String:AnyObject]) {
    self.userId = data["userId"] as! String
    self.firstName = data["fName"] as! String
    self.lastName = data["lName"] as! String
    self.imageBase64 = data["image"] as! String
  }
}

Ou - encore plus pratique si toutes les valeurs du dictionnaire sont des chaînes

parentView.savedDetailsModel = SBSavedUserModel(data:responseObject["data"].dictionaryObject as! [String:String])

...

required init ( data : [String:String]) {
    self.userId = data["userId"]!
    self.firstName = data["fName"]!
    self.lastName = data["lName"]!
    self.imageBase64 = data["image"]!
}
2
vadian