確かに挙げられている例は、クロージャーを使う理由がわからないような例ですね、、、
見ているかと思いますが以下参考
やっぱり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/11 04:48