Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
91
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

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?()
}
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
91
Help us understand the problem. What are the problem?