迅速な機能と閉鎖
4333 ワード
機能
func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
print("someFunction")
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6)
someFunction(parameterWithoutDefault: 4)
例:
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)
例:
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
閉鎖
クロージャは、あなたのコードで渡されて、使用されることができる機能の自己充足的なブロックです.クロージャは、定義されているコンテキストから任意の定数および変数への参照をキャプチャおよび格納できます.
閉鎖式
文法
{ (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))
Reference
この問題について(迅速な機能と閉鎖), 我々は、より多くの情報をここで見つけました https://dev.to/naveenragul/swift-function-and-closures-1hi5テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol