

(質問1)  
下のキャプチャ(a),(b)にある書き方はクロージャーなのでしょうか?

クロージャーは以下の様な記述だと思っていまして、(a)はクロージャになると思うのですが、  
(b)の記述はそうでないということでしょうか。

[code]

    var hogeHoge = { (parameters) -> return type in
        statements
    }
    
[/code]

(質問2)  
Playgroundで見ると、キャプチャにあるように(a),(b)は実行結果が違います。  
末尾に括弧があるかどうかの違いで、文法的にはどういう差になるのでしょうか?  
(a)は(b)の()を省略したくらいに思ってます。

よろしくお願いします。

[![Playgroundのキャプチャ](https://i.stack.imgur.com/dXttv.png)](https://i.stack.imgur.com/dXttv.png)


CC BY-SA 3.0
2016-02-20T09:21:21.703
22309
2016-02-20T09:42:03.613
5852
question
swift
Swiftのこのクロージャーみたいな記述について質問です


b のほうは末尾の `()` のために定義された関数(クロージャー)を呼び出しています。  
結果として定数値 10 が返ってきているのです。

また今は気にしなくても良いかもしれませんが、  
どちらも厳密にはクロージャーにはなっていません。  
関数を定義、利用しているだけです。

よって回答は以下のとおりです。

> 下のキャプチャ(a),(b)にある書き方はクロージャーなのでしょうか?

どちらも厳密にはクロージャーではありません。a は関数を定義しています。  
b は関数を定義した上で即時実行しています。

> 末尾に括弧があるかどうかの違いで、文法的にはどういう差になるのでしょうか?

括弧があることで、直前の関数が呼び出し、実行されています。

なおキャプチャの例がなぜクロージャーとはいえないのかについては
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3)
より以下を引用して説明に代えさせていただきます。

> 引数以外の変数を実行時の環境ではなく、自身が定義された環境（静的スコープ）において解決することを特徴とする。


CC BY-SA 3.0
2016-02-20T09:39:20.307
22310
2016-02-20T09:39:20.307
208
22309
answer


(テキストで表現できる質問内容は画像の貼り付けではなく、できるだけテキストにしてください。回答者側のPlaygroundなどにコピペするだけで事象が再現できれば、回答を得られる可能性がより高まります。今回は短いので直接打ち直しましたが。)

まとめて答えた方がわかりやすそうです。

> (質問1)  
>  下のキャプチャ(a),(b)にある書き方はクロージャーなのでしょうか?  
>  (質問2)  
>  Playgroundで見ると、キャプチャにあるように(a),(b)は実行結果が違います。  
>  末尾に括弧があるかどうかの違いで、文法的にはどういう差になるのでしょうか?

(a) `{ return 10 }`の部分がクロージャーで、`hoge`にはクロージャーが代入されます。  
(b) `{ return 10
}`の部分がクロージャーで、`()`は、そのクロージャーを呼び出すことを表します。`foo`にはそのクロージャーを呼び出した結果が代入されます。

> (a)は(b)の()を省略したくらいに思ってます。

クロージャーそのものを操作対象として変数に代入したりメソッドのパラメータに渡すのと、そのクロージャーを呼び出すのとはしっかり区別するようにしてください。Swiftでは、パラメータを取らない関数(メソッドやクロージャーも含めて)を呼び出す場合の`()`は省略できないため「()を省略したくらい」で意味が変わらないように感じられているとしたら大変危険です。


CC BY-SA 3.0
2016-02-20T09:42:03.613
22311
2016-02-20T09:42:03.613
13972
22309
answer