Замыкания и функции в Swift

09 февраля 2016

Замыкания в 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. И, для более подробного изучения языка, вы можете пройти наши курсы!

Урок подготовил: Иван Акулов

Источник урока.

Содержание