LoginSignup
97
90

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-18

こちらの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?()
}
97
90
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
97
90