Замыкания и функции в Swift
Замыкания в Swift похожи на блоки в C и Objective-C.
Замыкания являются объектами первого класса, так что они могут быть встроены и переданы (как и блоки в Objective-C).
В Swift функции - это просто особый вид замыканий.
Определение функции:
Вы определяете функцию с помощью ключевого слова func. Функции могут взять и не вернуть ничего, или вернуть один или несколько параметров (кортежи).
За возвращаемыми значениями идет знак ->.
func jediGreet(name: String, ability: String) -> (farewell: String, mayTheForceBeWithYou: String) {
return ("Прощай, \(name).", " Да прибудет с тобой \(ability).")
}
Вызываем функцию:
let retValue = jediGreet("old friend", ability: "Force")
print(retValue)
print(retValue.farewell)
print(retValue.mayTheForceBeWithYou)
Типы функций:
У каждой функции есть свой тип функции, состоящий из типов параметров и возвращаемого типа самой функции. Например у функции:
func sum(x: Int, y: Int) -> (result: Int) { return x + y }
имеет тип:
(Int, Int) -> (Int)
Поэтому типы функций могут быть использованы как типы параметров или как возвращаемые типы для вложенных функций.
Передаваемые или возвращаемые функции:
Следующая функция возвращает другую функцию в качестве своего результата, который может быть позже назначен в переменную и вызван.
func jediTrainer () -> ((String, Int) -> String) {
func train(name: String, times: Int) -> (String) {
return "\(name) has been trained in the Force \(times) times"
}
return train
}
let train = jediTrainer()
train("Obi Wan", 3)
Функции с вариативными параметрами
Функции с вариативными параметрами - это функции, имеющие переменное число аргументов (обозначаемых с помощью ... после типа аргумента), которые могут быть помещены в тело функции в виде массива.
func jediBladeColor (colors: String...) -> () {
for color in colors {
print("\(color)")
}
}
jediBladeColor("красный","зеленый")
Определение замыкания
Замыкания, как правило, заключены в фигурные скобки {} и определяются типом функции () -> (), где -> отделяет аргументы и возвращаемый тип, за которым следует ключевое слово in, которое отделяет заголовок замыкания от его тела.
{ (params) -> returnType in
statements
}
Примером может быть функция map, примененная к массиву:
let padawans = ["Knox", "Avitla", "Mennaus"]
padawans.map({
(padawan: String) -> String in
"\(padawan) has been trained!"
})
Замыкания с известными типами:
Когда типа аргумента замыкания известен, вы можете сделать следующим образом:
func applyMutliplication(value: Int, multFunction: Int -> Int) -> Int {
return multFunction(value)
}
applyMutliplication(2, multFunction: {value in
value * 3
})
Замыкания с сокращенными именами аргументов:
На аргументы замыканий могут ссылаться исходя из их позиции ($0, $1, ...) даже чаще, чем на их имена
applyMutliplication(2, multFunction: {$0 * 3})
Кроме того, когда замыкание - это последний аргумент функции, то скобки могут быть опущены, вот так:
applyMutliplication(2) {$0 * 3}
Что дальше?
Дальше, вы можете продолжить изучать наши туториалы по мере их появления, а также, параллельно читать перевод официальной книги по языку программирования Swift. И, для более подробного изучения языка, вы можете пройти наши курсы!
Урок подготовил: Иван Акулов