質問: { print("Hello, world!") } closure() ```
回答: 確かに挙げられている例は、クロージャーを使う理由がわからないような例ですね、、、 見ているかと思いますが以下参考 やっぱりSwift : 関数 #3 : クロージャ基礎 使っているところを提示したほうが分かりやすいと思いますので、クロージャーを使用した簡単な例を載せます。 処理を呼び出したところにダウンロードした画像が渡ってくる感じなので(コールバック)直感的にコードがかけると思います。 ``` // DownLoadManagerクラスを生成 let api = DownLoadManager() api.downLoadImage { (image) in // ダウンロードした画像を設定 self.imageView.image = image } class DownLoadManager { func downLoadImage(task: (image: UIImage) -> ()) { // ダウンロード処理・・・ // ダウンロードした画像を渡す task(image: downLoadImage) } } ``` 実際に動くサンプルは以下になります。 画面表示時に画像をダウンロードしてStoryboardに乗せたUIImageViewに画像を表示しています。 ``` import UIKit class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() let api = DownLoadManager() api.downLoadImage { (image) in if let image = image { // 画像のダウンロードが成功時画像が設定される self.imageView.image = image } else { print("ダウンロード失敗") } } } } class DownLoadManager { // クロージャー func downLoadImage(task: (image: UIImage?) -> ()) { // 画像ダウンロード let url = NSURL(string: "https://teratail.com/uploads/contributed_images/78379419b2c58363c546e3e6e094a8c9.png") let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: nil, delegateQueue: NSOperationQueue.mainQueue()) let req = NSURLRequest(URL: url!) // NSURLSession(通信クラス)のこのメソッドの引数もクロージャー let task = session.dataTaskWithRequest(req, completionHandler: { (data, response, error) in if let imageData = data , downLoadImage = UIImage(data: imageData) { // 画像ダウンロード成功時 task(image: downLoadImage) } else { // エラー時 print("Error!") task(image: nil) } }) task.resume() } } ```