2015-09-24 11 views
11

最近、私はXcodeを7に更新し、それにswift 2.0コンパイラが含まれています。これの前に私は迅速な古いバージョンで私のプロジェクトを作った。そのバージョンでは、私は私のテキストフィールドで、実行時にTHA値を記入し、上記のコードtxtEmail.texttxtPassword.textで怒鳴るswift 2.0でNSMutableDictionaryを作成するには

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

ようNSMutableDictionaryを作成していました。

このコードを正しく迅速の古いバージョンで動作しているが、SWIFT 2.0にアップデートした後、それは私にそれと間違って何怒鳴る

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

のようなエラーが発生しますが私を導いてください。

+1

*ヒント:*質問'[String:String?]'のマークは意味があります。 'txtEmail.text'はどのようなタイプですか? –

+0

NSMutableDictionaryが必要ですか?ネイティブスウィフト辞書を使用してみませんか? –

+1

txEmail.textまたはtxtPassword.textは、オプションの値ですか?もしそうなら、それらをアンラップし、エラーがまだ存在するかどうかチェックしてください。 – iamyogish

答えて

17

のようなものです、あなたは簡単に基礎となることを見ることができましたタイプは実際には[NSObject: AnyObject]です。値はnilにはなりません。 txtEmail.text!またはtxtPassword.text!などの

アンラップテキスト値は、[OK]を見て、あなたがコンパイルエラーを取り除くのに役立ちますが、UITextFieldの技術的textプロパティはオプションであるため、それは悪い選択だと、あなたのアプリが、その場合にクラッシュすることがあります!

あなたの安全のためにこれを行います

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

をところで、それはNSMutableDictionaryを使用することが重要ではない場合には、このようスウィフト辞書を使用することを検討してください:

var mutableDictionary = [String: AnyObject] 

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

ヌル・コアレース演算子のために、 '!'でアンラップするのではなく、 '??'をつけます。 – redent84

+0

良いコンセプト、多くの感謝... :) –

0

txtEmail.textおよび/またはtxtPassword.textは、タイプを変更するように指示する理由はオプションです。あなたは辞書を素早い辞書に書き換えることができます(これは私が推薦するものです)。そうするときは、オブジェクトをオプションにするか、ただちにStringのままにしておけば、dictを作成するときにオプションの文字列を叩くことができます。 "username" : txtEmail.text!代わり"username" : txtEmail.text

ので、最終的なコードで

var optionalString: String? 

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

はい、それもこれを実現する別の方法ですが、私は既存のコードでマイナーチェンジがあり、それが動作します。更新のためのbtwありがとう:) –

0

簡単な変更は、単にXcodeの7からNSMutableDictionaryまたはNSDictionaryクラスのインターフェイスを開くことで怒鳴る

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

ちょうどコンパイルエラーを実行時エラーに変換しました。 – redent84

関連する問題