クロージャー 基本的な書き方

クロージャーとは

・自分を囲むスコープにある変数を参照する関数
・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)])

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です