Руководство Swift Closure
1. Что такое Closure?
Closure: Означает "Замыкание", почти похоже на блок команд в C или Object-C. Closure это специальный блок команд, может иметь 0 или более параметров, и вид возврата.
Проще, посмотрите на объявление ниже, сможете ли вы угадать его значение?
Объявление выше может быть разъяснено в иллюстрации ниже:
Это синтаксис для объявления переменных с видами данных, и прикрепить значения переменным которые вам знакомы:
MyFirstClosure.swift
import Foundation
// Объявить переменную myVar1, с видом данных, и прикрепить к ней значение.
var myVar1 : () -> () = {
print("Hello from Closure 1");
}
// Объявить переменную myVar2, с видом данных, и прикрепить к ней значение.
var myVar2 : () -> (String) = { () -> (String) in
return "Hello from Closure 2"
}
// Объявить переменную myVar3, с видом данных, и прикрепить к ней значение.
var myVar3 : (Int, Int) -> (Int) = { (a : Int, b: Int) -> (Int) in
var c : Int = a + b
return c
}
func test_closure() {
// Выполнить Closure.
myVar1()
// Выполнить Closure, и получить возвратное значение.
var str2 = myVar2()
print(str2)
// Выполнить closure, передать (pass) параметры
// и получить возвратное значение.
var c: Int = myVar3(11, 22)
print(c)
}
Closure это блок команд, который может иметь параметры, и может иметь вид возврата:
Синтаксис Closure:
{ (parameters) -> returntype in
// statements
}
2. Function по сравнению с Closure
Function это особенный случай в Closure. Function это Closure с названием или можно сказать Closure это анонимный Function.
Определение:
Об использовании:
3. Объявление анонимного Closure
При объявлении Closure вам может не понадобится названия параметров, параметры могут ссылаться на $0, $1,...
AnonymousClosure.swift
import Foundation
// Объявить Closure обычным способом.
var myClosure : (String, String) -> String
= { (firstName: String, lastName: String) -> String in
return firstName + " " + lastName
}
// Объявить Closure анонимным способом (anonymous).
// (Пропустить названия параметров).
var anonymousClosure : (String, String) -> String
= {
// Использовать:
// $0: Первый параметр
// $1: Второй параметр
return $0 + " " + $1
}
Заметка: $0, $1,... это анонимные параметры, они используются только в анонимных Closure, если использовать в обычных Closure вы получите сообщение об ошибке:Anonymous closure arguments cannot be used inside a closure that has explicit arguments
Например с анонимным Closure (2):
AnonymosClosure2.swift
import Foundation
func test_anonymousClosure() {
// Объявить переменную вида Closure.
var mySum : ( Int, Int ) -> (Int)
// Прикрепить анонимный closure для нее.
// $0: Первый параметр
// $1: Второй параметр
mySum = {
return $0 + $1
}
var value = mySum(1, 2)
print(value)
}
4. Неявные возвращаемые значения
Если в содержании Closure имеется единственное выражение, вы можете пропустить ключевое слово return.
ImplicitReturnValues.swift
import Foundation
// Это Closure у которого содержание имеет одно единственное выражение
var closureWithReturn = { (a: Int, b: Int) -> Int in
// Единственное выражение (expression).
return a + b
}
// Можно пропустить ключевое слово 'return'.
var closureWithoutReturn = { (a: Int, b: Int) -> Int in
// Если только единственное выражение (expression).
// Можно пропустить ключевое слово 'return'.
a + b
}