Swift3.0まとめ - 関数・クロージャ -


こちらのSwift3.0バージョンです
http://qiita.com/merrill/items/2e143c0e3ecfb04243a2

関数

引数なし・戻り値なし

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

引数なし・戻り値あり

func hoge() -> Int{
    return 100
}

引数あり・戻り値あり

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

hoge(num: 100)

引数あり(引数の名前を省略)

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

hoge(100) // a: を省略できる

引数あり(複数)

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

hoge(a: 100, b: "テスト")

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

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

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

hoge(a: 100, 200)

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

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

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

引数を使って変数宣言

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

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

hoge(a: 100)

代入したい場合は、関数の中でvarの変数に入れ直す

func hoge(a: Int){
    print(a) // => 100
    var a = a
    a = 200
    print(a) // => 200
}

hoge(a: 100)

引数名とは違う名前を呼び出し時に指定

(あまりない使わない)

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

hoge(num: 100)

戻り値が複数

タプルを使用する

func compareNumber(arr: [Int]) -> (min: Int, max: Int) {
    let min = arr.min()
    let max = arr.max()

    return (min!, max!)
}

var result = compareNumber(arr: [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
    return a
}

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

var block = {(a: Int) -> Int in
    return a
}

block(2) // => 2

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

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

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

クロージャを Optional にする場合

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