Help us understand the problem. What is going on with this article?

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) {
  print(a)
  print(b)
}

hoge(100, "テスト")

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

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

func hoge(a: Int...) {
  print(a[0])
  print(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?()
}
merrill
予定とタスクを一括管理するiOSアプリ 「My Schedule」の開発者
https://myschedule.site
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away