Swift クロージャー

ホーム   目次


クロージャー

Closure (クロージャー)は、Haskellのラムダ式、JavaScriptの無名関数、Objective-Cのブロックと似た機能を持つ仕様です。

コーディングをしていて、一度しか使わないのに、わざわざ関数化するのに、抵抗がある場合や、ここに関数のような機能があればいいな、と思うことがあります。クロージャーはそのような時に使います。クロージャーは関数の一種です。クロージャーには名前をつける必要はありません。

クロージャーの基本

クロージャーの基本形は、

{ (引数名: 引数の型) -> 戻り値の型 in
    処理
}

と記述します。swiftインタープリターを起動して、次の例を試してみてください。

基本形


let a = { (num1: Int, num2: Int) -> Int in return num1 + num2 }
a (5, 5)
R0: Int = 10
    

定数に設定されたクロージャーを呼び出す場合は、引数にラベル名をつけません。

引数のない場合


let a = { () -> Int in return 100 }
a ()
R0: Int = 100
    

引数のないクロージャーを呼び出す場合も ( ) をつけます。

戻り値のない場合


let a = { (num1: Int, num2: Int) -> Void in print(num1 + num2) }
a (100, 100)
200
    

戻り値がない場合は、Void の代わりに ( ) と記述することもできます。


let a = { (num1: Int, num2: Int) -> () in print(num1 - num2) }
a (200, 100)
100
    

引数も戻り値もない場合


let a = { () -> Void in print("Hello") }
a ( )
Hello

let a ={ () -> () in print("Bye") }
a ( )
Bye
    

クロージャーは引数と戻り値の値の型推論が効くため、次のように省略して記述することも可能です。


let a = { print("Hi")}
a ()
Hi
    

シンタックスシュガー

シンタックスシュガー (糖衣構文)は、複雑な書き方を、簡単でわかりやすく書くことができる方法です。

処理が単文の場合は、returnが省略可能


let a = { (num1: Int, num2: Int) -> Int in num1 * num2) }
print ( a (5, 5) )
25
    

処理が単文の場合は、戻り値の型も省略可能


let a ={ (num1: Int, num2: Int) in num1 * num2 }
print ( a (5, 10) )
50
    

続く


1714 visits
Posted: Dec. 21, 2018
Update: Dec. 21, 2018

ホーム   目次   ページトップ