2015-09-24 17 views
11

Niedawno aktualizuję Xcode do wersji 7 i zawiera on kompilator SWIFT 2.0. Przedtem zrobiłem mój projekt ze starszą wersją szybkiej. W tej wersji miałem utworzyć NSMutableDictionary jak poniżejJak utworzyć NSMutableDictionary w swift 2.0

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

w powyższym kodzie txtEmail.text i txtPassword.text jest moje pole tekstowe i wypełnić tha wartość w czasie wykonywania.

Ten kod działa prawidłowo w starszej wersji Swift ale po aktualizacji do szybkiego 2,0 daje mi błąd jak poniżej

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

co jest nie tak z tym proszę kierować do mnie.

+1

* Podpowiedź: * Pytanie znak w '[String: String?] jest istotny. Jaki typ ma 'txtEmail.text'? –

+0

Czy na pewno potrzebujesz NSMutableDictionary? Dlaczego nie używać natywnego słownika Swift? –

+1

txEmail.text lub txtPassword.text, czy są to opcjonalne wartości? Jeśli tak, czy mógłbyś je odwijać i sprawdzić, czy błąd nadal istnieje. – iamyogish

Odpowiedz

17

prostu otwierając NSMutableDictionary lub NSDictionary interfejsy klasy z Xcode 7, można łatwo zobaczyć, że pod spodem typ to faktycznie [NSObject: AnyObject]. Oznacza to, że wartość nie może być nil.

rozpakowaniu wartości tekstowe jak txtEmail.text! lub txtPassword.text! może wyglądać ok i pomóc pozbyć się błędu opracowującym, ale jest to zły wybór, ponieważ technicznie text własnością UITextField jest opcjonalny i aplikacja może upaść w tym przypadku!

Zrób to dla własnego bezpieczeństwa:

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

Nawiasem mówiąc, w przypadku gdy nie jest krytyczna używać NSMutableDictionary należy rozważyć użycie Swift słownika tak:

var mutableDictionary = [String: AnyObject] 

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

Kciuki za operatora zerowego koalescencji '??' zamiast rozpakowywania z '!' – redent84

+0

Dobra koncepcja, wielkie dzięki ... :) –

0

txtEmail.text i/lub txtPassword.text zwracają opcjonalne, dlatego zaleca się zmienić typ. Możesz przepisać dyktat jako szybki słownik (co polecam). Gdy to zrobisz, możesz albo uczynić obiekt opcjonalnym, albo pozostawić go jako tylko String i wybić opcjonalny ciąg podczas tworzenia dyktatury.

var optionalString: String? 

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

Tak, jest to również inny sposób, aby to spełnić, ale mam zmianę w istniejącym kodzie i działa. btw dzięki za aktualizację :) –

0

prosta zmiana w "username" : txtEmail.text! zamiast "username" : txtEmail.text

więc ostatecznego kodu jest jak poniżej

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

Przekonwertowałeś błąd kompilacji do błędu runtime, yay! – redent84

Powiązane problemy