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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

3回答

9634閲覧

【Swift】クロージャの必要性

engawa

総合スコア31

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

6クリップ

投稿2016/04/10 15:40

C言語の勉強が少し行き詰っているので、一時的にSwiftの公式リファレンスを読んでみたのですが、クロージャの概念がよくわかりません。まず定義からしてよくわからないのです。

クロージャ(クロージャー、英語: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。【Wikiprdia】

いろいろ調べてみたところjavascriptにもこの概念があるようで、メリットは変数の宣言を節約できる云々書いてあったのですが、あまり納得のいく解説がありません。
例えば、以下のようなただの関数と、クロージャを用いたコードがある場合、メリットどころか普通の関数の方が記述量が少ないですよね?(もっと複雑なコードでは重宝するのですかね...)
どなたかクロージャのメリットなど教えていただけませんか。

Swift

1//関数 2func put() { 3 print("Hello, world!") 4} 5put() 6 7//クロージャ 8var closure: () -> () = { 9 print("Hello, world!") 10} 11closure()

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

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

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

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

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

guest

回答3

0

ベストアンサー

確かに挙げられている例は、クロージャーを使う理由がわからないような例ですね、、、

見ているかと思いますが以下参考
やっぱりSwift : 関数 #3 : クロージャ基礎

使っているところを提示したほうが分かりやすいと思いますので、クロージャーを使用した簡単な例を載せます。

処理を呼び出したところにダウンロードした画像が渡ってくる感じなので(コールバック)直感的にコードがかけると思います。

swift

1// DownLoadManagerクラスを生成 2let api = DownLoadManager() 3 4api.downLoadImage { (image) in 5 6 // ダウンロードした画像を設定 7 self.imageView.image = image 8} 9 10class DownLoadManager { 11 func downLoadImage(task: (image: UIImage) -> ()) { 12 // ダウンロード処理・・・ 13 14 // ダウンロードした画像を渡す 15 task(image: downLoadImage) 16 } 17}

実際に動くサンプルは以下になります。
画面表示時に画像をダウンロードしてStoryboardに乗せたUIImageViewに画像を表示しています。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var imageView: UIImageView! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 let api = DownLoadManager() 11 api.downLoadImage { (image) in 12 13 if let image = image { 14 15 // 画像のダウンロードが成功時画像が設定される 16 self.imageView.image = image 17 } else { 18 print("ダウンロード失敗") 19 } 20 } 21 } 22} 23 24 25class DownLoadManager { 26 27 // クロージャー 28 func downLoadImage(task: (image: UIImage?) -> ()) { 29 30 // 画像ダウンロード 31 let url = NSURL(string: "https://teratail.com/uploads/contributed_images/78379419b2c58363c546e3e6e094a8c9.png") 32 let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: nil, delegateQueue: NSOperationQueue.mainQueue()) 33 let req = NSURLRequest(URL: url!) 34 35 // NSURLSession(通信クラス)のこのメソッドの引数もクロージャー 36 let task = session.dataTaskWithRequest(req, completionHandler: { (data, response, error) in 37 38 if let imageData = data , downLoadImage = UIImage(data: imageData) { 39 // 画像ダウンロード成功時 40 task(image: downLoadImage) 41 42 } else { 43 // エラー時 44 print("Error!") 45 task(image: nil) 46 } 47 }) 48 task.resume() 49 } 50}

投稿2016/04/10 22:06

編集2016/07/10 11:40
_Kentarou

総合スコア8490

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

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

engawa

2016/04/11 04:48

やはり質問に使用したようなコードではなく、より高度な処理で力を発揮するのですね。回答していただいたコードの、メソッドの引数にクロージャを使用しているところなどは、まだ初心者の私には難解でしたが、紹介してくださったリンクの説明を読んで、ふんわりとわかったような気がします。今後リファレンスを読み進め、またこのコードを眺めてみたいと思います。回答ありがとうございました。
guest

0

投稿2016/04/11 01:41

tkturbo

総合スコア5572

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

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

engawa

2016/04/11 04:56

関数をネストすることがクロージャなのかといったら違うような気もしますが、今の所そのくらいの解釈にとどめておきます。実行時にインクリメントしてくれる関数の例では、クロージャによって値が保持されるという利点があるのですね。なかなか奥が深そうです。回答ありがとうございました。
guest

0

さくっと言うと、「今定義している変数を、後で使えるのがイイ」というところ。
引数の宣言や、構造体の定義等、いろいろなものを省略できます。
C++ならラムダ式のキャプチャや、関数バインド(std::bind)が似たような機能です。

Swiftの利用経験は少ないので、クロージャ(と呼ばれているあの書き方)について
きっとこの辺りが便利なんだろうなあ、というふんわりと掴んだ感じです。

以下のサイトの解説がとてもわかり易かったです。
http://qiita.com/mochizukikotaro/items/7403835a0dbb00ea71ae

投稿2016/04/11 01:48

tnd-.-b

総合スコア247

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

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

engawa

2016/04/11 05:01

調べた際にこのサイトを読ませていただきました。確かにわかりやすい解説だったのですが、やはりどこかモヤモヤっとしたものがありました。おそらく使用例などのサンプルコードを難しくても読んでみるのがいいのでしょうかね。回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問