Swift

Swiftまとめ - 関数・クロージャ -

More than 1 year has passed since last update.

追記: 2016/9/19
Swift3.0版はこちらです
http://qiita.com/merrill/items/2a2a069771cb89d5499b

関数

引数なし・戻り値なし

func hello(){
  print("Hello!")
}

引数なし・戻り値あり

func hoge() -> Int{
  return 100
}

引数あり・戻り値あり

func hoge(num: Int) -> Int{
  return num
}

hoge(100)

引数あり(複数)

func hoge(a: Int, b: String){
  println(a)
  println(b)
}

hoge(100, "テスト")

引数あり(複数かつ数を指定しない)

引数の値は配列として格納される。

func hoge(a: Int...){
  println(a[0])
  println(a[1])
}

hoge(100, 200)

引数あり(初期値を設定)

func hoge(a: Int = 100){
  print(a)
}

hoge() // => 100
hoge(a: 200) // => 200 ※引数にデフォルト値を指定した場合は、引数のラベル名が必要になる!

引数を使って変数宣言

引数のパラメータは、通常定数(let)として扱われるので、値を代入することはできない。

func hoge(a: Int){
  a = 200 // エラー
}

hoge(100)

ただし、引数でvar宣言をしてあげるとエラーにならない。

func hoge(var a: Int){
 a = 200 // OK
}

hoge(100)

名前付き引数(外部引数)を使う

引数の変数名の前に#をつける。

func hoge(#a: Int){
 print(a)
}

hoge(a: 100)

第2引数以降は、自動的に引数名が名前付き引数となるので#はつけない。

func hoge(#a: Int, b: Int){
 print(a)
 print(b)
}

hoge(a: 100, b: 200)

あまりないと思うが、引数名とは別名で指定したい場合は、以下のように書ける。

func hoge(num a: Int){
 print(a)
}

hoge(num: 100)

戻り値が複数

タプルを使用する。

func compareNumber(arr: [Int]) -> (min: Int, max: Int) {
    var min = minElement(arr)
    var max = maxElement(arr)

    return (min, max)
}

var result = compareNumber([1,2,3,4,5,6,7,8,9,10])
result.min // => 1
result.max // => 10

オーバーロード

引数の数や、外部引数の名前が異なれば、同じ名前の関数をたくさん定義できる。

func hoge(){
  print(100)
}

func hoge(#a: Int){
  print(a)
}

func hoge(#b: Int){
  print(b)
}

hoge() // => 100
hoge(a: 200) // => 200
hoge(b: 300) // => 300

クロージャ

名前がない関数。{}で囲まれたブロック。メソッドのように呼び出すのではなく、その場で実行される。関数の引数でよく利用される。

引数なし・戻り値なし

型は () -> Void

{() -> void in
  ...
}

引数あり・戻り値なし

型は (a: Int) -> Void

{(a: Int) -> void in
  ...
}

引数あり・戻り値あり

型は (a: Int) -> Int

{(a: Int) -> Int in
  ...
}

クロージャを変数に入れることも可能

var plus = { (a: Int, b: Int) -> Int in a + b }

サーバリクエストのコールバックとして、クロージャを引数で受け取る関数を書くのはよく使われる。

# requestメソッド呼び出し
request(
  params: params,
  success: {() -> Void in
    println("通信成功")
  }, 
  error: {() -> Void in
    println("通信エラー")
  }
)

# クロージャを受け取るrequestメソッド
func request(request: request, success: () -> Void, error: () -> Void) {
    //渡されたクロージャを実行する
    success()
}

クロージャを渡さず nil を渡す場合は、クロージャを Optional にできる。

func request(success: (()->Void)?) {
    success?()
}