2015-09-24 19 views
11

Kürzlich Update Xcode zu 7 und es enthält Swift 2.0 Compiler. Vorher habe ich mein Projekt mit einer älteren Version von swift gemacht. In dieser Version hatte ich NSMutableDictionary erstellen wie untenWie NSMutableDictionary in Swift 2.0 zu erstellen

let dictParams:NSMutableDictionary? = ["test" : "test", 
     "username" : txtEmail.text, 
     "password" : txtPassword.text, 
     "version" : "1.0", 
     "appId" : "1", 
     "deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg" 
    ]; 

in obigem Code txtEmail.text und txtPassword.text ist mein Textfeld und tha Wert während der Laufzeit füllen.

Dieser Code funktioniert einwandfrei in älterer Version von schnellen, aber nach dem Update zu schnellen 2.0 gibt es mir einen Fehler wie unten

Cannot convert value of type '[String : String?]' to specified type 'NSMutableDictionary?' 

was falsch ist mir bitte führen.

+1

* Hinweis: * Die Frage Markierung in '[String: String?]' ist relevant. Welcher Typ hat 'txtEmail.text'? –

+0

Sind Sie sicher, dass Sie ein NSMutableDictionary benötigen? Warum nicht ein natives Swift-Wörterbuch verwenden? –

+1

Die txEmail.text oder txtPassword.text, sind sie optionaler Wert? Wenn ja, würden Sie sie auspacken und prüfen, ob der Fehler weiterhin besteht. – iamyogish

Antwort

17

einfach durch NSMutableDictionary oder NSDictionary Klasse Schnittstellen von Xcode Öffnung 7, könnte man leicht sehen, dass die zugrunde liegend Typ ist eigentlich [NSObject: AnyObject]. Dies bedeutet, dass der Wert nicht nil sein kann.

Defolieren Textwerte wie txtEmail.text! oder txtPassword.text! aussehen könnte ok und helfen Sie loswerden der Kompilierung Fehler zu bekommen, aber es ist eine schlechte Wahl, weil technisch text Eigenschaft UITextField optional ist und Ihre Anwendung kann in diesem Fall zum Absturz!

Tun Sie dies für Ihre Sicherheit:

let dictParams: NSMutableDictionary? = ["test" : "test", 
    "username" : txtEmail.text ?? "", // Always use optional values carefully! 
    "password" : txtPassword.text ?? "", 
    "version" : "1.0", 
    "appId" : "1", 
    "deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg" 
] 

By the way, falls kritisch es ist nicht NSMutableDictionary zu verwenden, beachten Sie bitte Swift-Wörterbuch wie folgt aus:

var mutableDictionary = [String: AnyObject] 

// OR this if the value can be nil 
var mutableDictionary = [String: AnyObject?] 
+0

Daumen hoch für Null-Coalesce-Operator '' 'statt mit'! ' – redent84

+0

auszupacken. Gutes Konzept, vielen Dank ... :) –

0

txtEmail.text und/oder txtPassword.text geben ein optionales zurück, weshalb es Ihnen sagt, den Typ zu ändern. Du könntest das Diktat als ein schnelles Wörterbuch umschreiben (was ich empfehlen würde). Wenn Sie dies tun, können Sie entweder das Objekt optional machen oder es einfach als String belassen und die optionale Zeichenkette beim Erstellen des Diktats ausgeben.

var optionalString: String? 

var someDict: [String: String?] = ["test": "test", "test1": optionalString] 
+0

Ja, das ist auch eine andere Möglichkeit, dies zu erfüllen, aber ich habe kleinere Änderungen im bestehenden Code und es funktioniert. btw danke für update :) –

0

einfache Änderung in "username" : txtEmail.text! statt "username" : txtEmail.text

so endgültigen Code ist wie unten

let dictParams:NSMutableDictionary? = ["test" : "test", 
     "username" : txtEmail.text!,  //Add ! here 
     "password" : txtPassword.text!, //Add ! here 
     "version" : "1.0", 
     "appId" : "1", 
     "deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg" 
    ]; 
+3

Du hast gerade einen Übersetzungsfehler in einen Laufzeitfehler umgewandelt, yay! – redent84

Verwandte Themen