質問: ["email":nameTextField.text] //ここを nameTextField.text! とするとエラーが消えます。 Alamofire.request(.GET, apiURL, parameters:parameters ) .validate() .responseJSON { response in //処理 ``` StringはAnyObjectを継承しているからAnyObjectにStringを入れること自体は問題なく、ただオプショナル型を使うならアンラップして(nilが入らないか確認して)使えよってことでしょうか?
回答: > > StringはAnyObjectを継承しているからAnyObjectにStringを入れること自体は問題なく > > > AnyObjectは、どんなオブジェクトでも受け付ける言うなれば Objectの入れ物みたいな型ですね。厳密に言うと色々あると思いますが。 -- 型変換ですが、 ["email":nameTextField.text] -> (parametersの型)[String:String?] -> [String:AnyObject?] という関係にあるので、言うなれば nil の入る可能性のある AnyObject? に変換できます。 一方、Alamofire が期待しているのは [String:AnyObject] であり(AnyObject に nil を許容しない)、 ["email":nameTextField.text!] -> (parametersの型)[String:String] -> [String:AnyObject] と、この場合は nil の入らない String に変換できれるので正しく受け付けられます。 ただ、強制開示はあまり推奨されない方法なので(Github Style guide でも禁止されているしアプリが落ちる原因なので)、実際には以下のような方法をおすすめします。 ``` let parameters = ["email": nameTextField.text ?? ""] // もしくは guard let email = nameTextField.text else { return } let parameters = ["email": email] ``` 詳しく知りたい場合は、Swift の型推論(`let parameters`の型をSwiftがどう自動判定するのか)を勉強されることをおすすめします。