クロージャーとは
・自分を囲むスコープにある変数を参照する関数
・Swiftでは、クロージャーはメソッドの引数として利用されることが多い。。。
基本的な書き方
{(引数:引数の型) -> (戻り値の型) in // 処理 return 戻り値 }
引数も戻り値もない場合
var Closure = {() -> () in var a = 1+1 println(a) // 2 }
宣言だけして後から定義する場合
//宣言 var paramClosure: (String) -> String //クロージャの定義 paramClosure = { p -> String in return "よう。" + p + "さん" } // 使用 println(paramClosure("test"))
引数にクロージャーを取る関数
例) map関数
map(配列, クロージャ)
let numbers = [0.02,0.4,0.26,0.8] // 指定した配列内の数値一つずつをパーセンテージ化 let array = map(numbers, { (let num:Double) -> String in var percent = num*100 return percent.description + "%" }) // [2.0%, 40.0%, 26.0%, 80.0%] println(array)
クロージャーを受け取る関数
*これが一番理解に時間かかった。。。
// メニューのDictionary var menuDictionary = ["Coffee":300.0,"cappuccino":400.0,"Latte":400.0,"mocca":450.0] // 税込み価格を返すクロージャ var getIntaxPrice = {(name:String, value:Double) -> (String,Double) in print("getIntaxPrice") print("getIntaxPrice name :\(name)") print("getIntaxPrice value :\(value)") return (name,value*1.08) } // メニューのDictionaryを受け取って、税込み価格に変換したDictionaryを返す関数 func dicMap( dic:Dictionary<String,Double>, closure:(String,Double) -> (String,Double)) -> Dictionary<String,Double> { var dic2 :Dictionary<String,Double> = dic for (key, value) in dic { print("dicMap") let(theKey, newValue) = closure(key,value) print("dicMap name :\(theKey)") print("dicMap value :\(newValue)") dic2[theKey] = newValue } return dic2 } // 税込み価格のメニュー let inTaxMenuDictionary = dicMap(dic: menuDictionary,closure: getIntaxPrice) print(inTaxMenuDictionary)
上記ソースを実行した場合のログ
dicMap getIntaxPrice getIntaxPrice name :mocca getIntaxPrice value :450.0 dicMap name :mocca dicMap value :486.00000000000006 dicMap getIntaxPrice getIntaxPrice name :Coffee getIntaxPrice value :300.0 dicMap name :Coffee dicMap value :324.0 dicMap getIntaxPrice getIntaxPrice name :cappuccino getIntaxPrice value :400.0 dicMap name :cappuccino dicMap value :432.0 dicMap getIntaxPrice getIntaxPrice name :Latte getIntaxPrice value :400.0 dicMap name :Latte dicMap value :432.0 ["mocca": 486.00000000000006, "Coffee": 324.0, "cappuccino": 432.0, "Latte": 432.0]
クロージャーの省略
let nums : Array = [1, 2, 3, 4, 5]
省略しない書き方
nums.map({(elem: Int) -> Int in return elem * 2 })
引数の型と戻り値の型を省略(型推論)
nums.map({elem in return elem * 2 })
return文を省略
nums.map({elem in elem * 2 })
引数を省略
引数を省略する場合には、「$n」でn番目の引数を利用できる
nums.map({ $0 * 2 })
{}を省略
nums.map($0 * 2)
参考にさせていただいたURL
Swiftでクロージャ (Closure)を簡単にまとめてみる
Swift さくっと確認したい基礎文法 [クロージャ(closure)])