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

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

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

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

Q&A

解決済

1回答

1954閲覧

swift: クロージャの型指定について error: ambiguous use of ...

tk_matsumoto

総合スコア17

Swift

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

1グッド

0クリップ

投稿2016/10/27 06:15

編集2016/10/27 06:32

概要

  • Swift 初心者です。文法にて疑問に思っている点を質問させてください!
  • 以下コードにて、エラーが出てしまっている理由がわかりません。
class Person { func response( ok: ([String: Any]) -> Void, ng: () -> Void ) -> Void { ok(["test": "test"]) ng() } func response( ok: () -> Void, ng: () -> Void ) -> Void { ok() ng() } } let person = Person() person.response( ok: { r in print(r) }, ng: { print("ng") } ) // error: ambiguous use of 'response(ok:ng:)'
  • error: ambiguous use of 'response(ok:ng:) のエラーが出てしまっており、二つの関数が同じモノとして、判断されている理由がわかりません
  • 外部引数の名前が異なる場合引数の型が異なる場合は関数名が同じでもオーバーロードにより違う関数と解釈されると自分のなかでは理解しております。
  • 今回のケースでは、引数にとっているクロージャーの型が異なり、実行時に ok メソッドに引数を指定しているので、["test": "test"] が表示される事を期待しているのですが、思った通りにいかなく疑問に思っている感じです。

質問

  • 引数に指定しているクロージャーの型が違うにもかかわらず、エラーが出てしまっているのはどうしてでしょうか?

ご回答お願いします!

fromageblanc👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

() -> Voidは、引数が無い関数ではなく、引数を一つ受け取る関数です。

swift

1var hoge: () -> Void 2hoge = { 3 param in 4 print("param =", param) 5} 6print(hoge()) 7//=> param = () //空タプルを受け取っている 8//=> () //ついでに、Voidは空タプルを返しています 9 10//引数が2つだとエラーになる 11hoge = { 12 param1, param2 in 13 print("param =", param1, param2) 14} 15//=> エラー

なので、

swift

1person.response( ok: { r in print(r) }, ng: { print("ng") } )

これは下のresponseにも渡せるということになります。

投稿2016/10/27 07:47

編集2016/10/27 07:49
fuzzball

総合スコア16731

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

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

tk_matsumoto

2016/10/27 07:55

> () -> Voidは、引数が無い関数ではなく、引数を一つ受け取る関数です。 なるほど!引数がない関数だと思っておりました!ご回答ありがとうございました!
tk_matsumoto

2016/10/27 08:40 編集

すみません、追加の質問になってしまうのですが、この場合引数に引数がない関数を指定する記述方法はあるのでしょうか?いくつか記事を読んでみたのですが、`() -> Void` が引数なしと書いてあるところが多く ...
fuzzball

2016/10/27 09:42 編集

参考サイト http://dev.classmethod.jp/smartphone/swift-function-tuple/ 戻り値について >>戻り値を返さないと定義された関数も、実際には空タプルを返しています。 >>(中略) >>Swift においては全ての戻り値がタプルとして扱われているであろう >>ということが推測できます。 引数について >>パラメータの数が0個として定義された関数は、空のタプルを引数として >>受け取るようになっています。 つまり、Swift においては、 >>戻り値と同様に全ての関数が何らかの引数を取ることになります。
tk_matsumoto

2016/10/27 10:01

> 戻り値と同様に全ての関数が何らかの引数を取ることになります 参考サイト読ませていただきました。なるほど、必ず引数が存在する仕様になっているんですね。再度ご回答ありがとうございました!とても勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問