質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

18935閲覧

【Swift】納得のいかないエラー解決法(型関連)について

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

1クリップ

投稿2016/07/13 03:40

###前提・実現したいこと
alamofireのリクエストで渡すパラメーターを設定していたのですが、
パラメーターの値にAnyObjectを渡せと怒られるのに、
String型のアンラップした値を渡したら怒られなくなりました。

釈然としなかったので根本的な理由を教えて欲しいです><

###発生している問題・エラーメッセージ

Cannot convert value of type '[String:String?]' to expected argument type '[String:AnyObject]?'

###該当のソースコード

Swift

1let okAction = UIAlertAction(title: NSLocalizedString("OK", comment: "OK"), style: .Default) { _ in 2 3 let apiURL = kAwsApiRequestPasswordReset 4 5 let nameTextField = alertController.textFields!.first! 6 let parameters = ["email":nameTextField.text] 7 //ここを nameTextField.text! とするとエラーが消えます。 8 9 Alamofire.request(.GET, apiURL, parameters:parameters ) 10 .validate() 11 .responseJSON { response in 12 //処理

StringはAnyObjectを継承しているからAnyObjectにStringを入れること自体は問題なく、ただオプショナル型を使うならアンラップして(nilが入らないか確認して)使えよってことでしょうか?

mondaminZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

String?Optional<String>のシンタックスシュガーです。
Optional<T>enumです。
AnyObjectはクラスを表します。
enumはクラスではありません。
なので、String?AnyObjectではありません。

投稿2016/07/13 04:03

編集2016/07/13 04:09
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/13 08:31

Optional<String>に飛んでみたら確かにenumでした..!! いつもなんとなく使っているものが実体はなんなのか、 ちゃんと確認しておく必要があることに気がつかされました>< 良い気づきとご回答ありがとうございます!^^
guest

0

ベストアンサー

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がどう自動判定するのか)を勉強されることをおすすめします。

投稿2016/07/13 04:05

編集2016/07/13 04:07
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/13 08:27

sasaron397さん 回答ありがとうございます! expected typeに全て同じにしないといけないと思っていたのですが、 型の階層といいますか、 それによっては全く同じ型でなくとも許容できるということ、 改めて認識しました! 具体的な改善記載方法、何を学んだら良いかまで丁寧に御呈示くださったsasaron397さんをベストアンサーとさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問