迅速な機能と閉鎖

4333 ワード

機能

  • 関数は複数のパラメータに0パラメータを持つことができます.
  • 関数は0個の戻り値(void)または複数の戻り値(タプルを使用する)、あるいは戻り値として任意であることができます.
  • 各関数パラメーターは引数ラベルとパラメータ名を持ちます.既定では、引数のラベルが指定されていない場合、パラメーターは引数のラベルとしてパラメータ名を使用します.
  • パラメータの引数ラベルを必要としない場合は、アンダースコア(
  • は、パラメーターの型の後にパラメーターに値を割り当てることによって、関数内の任意のパラメーターの既定値を定義できます.既定値が定義されている場合、その関数を呼び出すときには、そのパラメータを省略できます.
  • 例:
    func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
        print("someFunction")
    }
    someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) 
    someFunction(parameterWithoutDefault: 4) 
    
  • variadicパラメータ(...)指定した型の0以上の値を受け入れます.変数として渡された値は、関数の本体内で配列として使用可能になります.
  • variadicパラメータの後に来る最初のパラメタはあいまいさを避けるために引数ラベルを持たなければなりません.
    例:
    func arithmeticMean(_ numbers: Double...) -> Double {
        var total: Double = 0
        for number in numbers {
            total += number
        }
        return total / Double(numbers.count)
    }
    arithmeticMean(1, 2, 3, 4, 5)
    
  • 関数のパラメータがデフォルトで定数であるため、関数のパラメーターの値を変更する場合は、そのパラメーターをout outパラメーターと定義します.変数名の前にアンパサンド(& )を置き、inoutパラメータに値を渡します.
  • outパラメーターではデフォルト値を指定できません.また、variadicパラメーターはinoutとしてマークできません.
    例:
    func swapTwoInts(_ a: inout Int, _ b: inout Int) {
        let temporaryA = a
        a = b
        b = temporaryA
    }
    var someInt = 3
    var anotherInt = 107
    swapTwoInts(&someInt, &anotherInt)
    
  • 他の型と同様に関数型を使用します.
  • 例:
    func addTwoInts(_ a: Int, _ b: Int) -> Int {
        return a + b
    }
    var mathFunction: (Int, Int) -> Int = addTwoInts
    
  • 関数型は、パラメーター型または戻り値型
  • として使用できます

    閉鎖


    クロージャは、あなたのコードで渡されて、使用されることができる機能の自己充足的なブロックです.クロージャは、定義されているコンテキストから任意の定数および変数への参照をキャプチャおよび格納できます.
  • 閉鎖は、3つの形のうちの1つをとります:
  • グローバル関数は名前を持ち、任意の値をキャプチャしないクロージャです.
  • 入れ子関数は名前を持つクロージャで、その関数を囲む関数から値を取得できます.
  • クロージャ式は、その周囲のコンテキストから値を取得できる軽量構文で記述されていない名前付きクロージャです.
  • 閉鎖式


    文法{ (parameters) -> return type in
    statements
    }
    例:
    let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
    reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
        return s1 > s2
    })
    
  • 速記閉鎖構文
    コンテキストからパラメータと戻り値の型を推論する.
    単一の式クロージャからの暗黙のリターン.
    例:
  • reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
    
  • 短縮引数名
  • 例:
    reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
    

  • 末尾の閉鎖-関数の最終引数としての関数へのクローズ式とクロージャ表現は長いので、代わりに末尾の閉鎖として書くことができます.
  • 例:
    reversedNames = names.sorted() { $0 > $1 }
    
    関数の論理和メソッドの引数としてクロージャ式が与えられている場合、括弧()は省略可能です.
    reversedNames = names.sorted { $0 > $1 }
    
    クロージャと関数は参照型です.関数またはクロージャを定数または変数に割り当てるたびに、実際にはその定数または変数を関数またはクロージャへの参照として設定します.

    脱出閉鎖


    クロージャは関数への引数として渡されるときに関数をエスケープすると言われますが、関数が返された後に呼び出されます.@ closeを実行して、パラメータの型の前に、クロージャがエスケープされることを示します.
    例:
    var completionHandlers: [() -> Void] = []
    func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
        completionHandlers.append(completionHandler)
    }
    

    自動閉鎖

  • 自動閉鎖は、関数に引数として渡される式をラップするために自動的に作成されるクロージャです.
  • それはどんな引数も取りません、そして、それが呼ばれるとき、それはそれの中で包まれる式の値を返します.
  • 例:
    自動閉鎖なしで
    var customersInLine = ["Chris", "Alex", "Ewa","Barry"]
    func serve(customer customerProvider: () -> String) {
        print("Now serving \(customerProvider())!") ////"Now serving Chris!"
    }
    serve(customer: { customersInLine.remove(at: 0) } )
    
    自動閉鎖
    var customersInLine = ["Chris", "Alex", "Ewa", "Barry"]
    func serve(customer customerProvider: @autoclosure () -> String) {
        print("Now serving \(customerProvider())!") ////"Now serving Chris!"
    }
    serve(customer: customersInLine.remove(at: 0))