Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cast from [String:AnyObject] to unrelated type NSMutableDictionary always fails Warning

Code is working, but how do I silent this warning that keeps on appearing every time?

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

cast from '[String:AnyObject]' to unrelated type 'NSMutableDictionary' always fails Warning

SavedUserModel stores saved information:--

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
}
like image 775
Jitendra Avatar asked Feb 06 '16 19:02

Jitendra


2 Answers

Try replacing

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

with this:

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

You could easily cast it into a NSDictionary, but for some reason when you want a NSMutableDictionary, you have to initialize a new one with NSMutableDictionary(dictionary:)

Edit: see the comment on this question by @Tommy for why this is necessary.

like image 110
Addison Avatar answered Nov 17 '22 16:11

Addison


Unlike NSArray and NSDictionary the mutable Foundation collection types NSMutableArray and NSMutableDictionary are not bridged to the Swift counterparts.

The easiest solution is to keep using Swift native types

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
  }
}

Or – still more convenient if all values in the dictionary are strings

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"]!
}
like image 2
vadian Avatar answered Nov 17 '22 16:11

vadian