2016-02-06 3 views
6

Code funktioniert, aber wie kann ich diese Warnung stummschalten, die jedes Mal angezeigt wird?Umwandlung von [String: AnyObject] in nicht verwandten Typ NSMutableDictionary schlägt immer fehl Warnung

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

Umwandlung von '[String: ANYOBJECT]' an unabhängige Typ 'NSMutableDictionary'

ausfällt Warnung immer

SavedUserModel speichert Informationen gespeichert: -

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

Warum möchten Sie, dass Ihr Wörterbuch änderbar ist? – Tommy

+0

Da sich der Inhalt des Wörterbuchs zur Laufzeit ändern kann. Als Benutzer kann Details beliebig oft ändern/bearbeiten. @Tommy – Jitendra

+0

Der Code, den Sie uns gegeben haben, sucht vier Wörter aus dem Wörterbuch und verwendet sie dann nie wieder. – Tommy

Antwort

4

Versuchen

ersetzen

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

mit diesem:

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

Sie leicht in eine NSDictionary werfen könnte, aber aus irgendeinem Grund, wenn Sie einen NSMutableDictionary wollen, müssen Sie mit NSMutableDictionary(dictionary:)

bearbeiten einen neuen initialisieren : Siehe den Kommentar zu dieser Frage von @Tommy, warum dies notwendig ist.

+0

Großartig Es hat funktioniert !! :) @addison – Jitendra

+0

Super! Denken Sie daran, dies als die akzeptierte Antwort zu wählen :) – Addison

+1

Die "aus irgendeinem Grund" ist, dass Sie mit einem unveränderlichen Wörterbuch beginnen. Es ist nicht merkwürdig, dass die Sprache es nicht erlaubt, sie zu mutieren. "Dieses Objekt ist unveränderlich" bedeutet nicht "dieses Objekt benötigt etwas mehr arkane Syntax, um zu mutieren". – Tommy

2

Im Gegensatz zu NSArray und NSDictionary die wandelbar Foundation Sammlungstypen NSMutableArray und NSMutableDictionary sind nicht auf die Swift Pendants überbrückt.

Die einfachste Lösung ist native Typen mit Swift zu halten

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

Oder - noch bequemer, wenn alle Werte im Wörterbuch sind 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"]! 
} 
+0

Die Lösung ist korrekt, aber aus bestimmten Gründen benutze ich NSMutableDictionary für veränderbare Objekte. Schnelle native Typen sind immer die beste Wahl, wenn wir nur in swift programmieren. – Jitendra

-1

Hoffnung auf diese Weise kann help you: mutableDictionary as NSDictionary as? [String: AnyObject] gleiche Weise funktioniert auf NSMutableArray.

Verwandte Themen