greet(person:)
, так как то, что она делает - она принимает имя человека в качестве входного значения и возвращает для этого человека приветствие. Для достижения этого Вы задаете один входной параметр - значение типа String
под названием person - и выходной имя String
, который будет содержать приветствие для этого человека:
func greet(person: String) -> String {
let greeting = "Здравствуй, " + person + "!"
return greeting
}
Вся эта информация заключена в определении функции, которое претворяется ключевым словом func
. Вы определяете тип возвращаемого функцией значения с помощью стрелки-возврата -> (дефис, дополненный правой угловой скобкой), которое дополняется именем типа возвращаемого.
print(greet(person: "Артём"))
// Печатает "Здравствуй, Артём!"
print(greet(person: "Женя"))
// Печатает "Здравствуй, Женя!"
Вы вызываете функцию greet(person:)
, передавая ей значение типа String
после маркера аргумента label
, как например greet(person: "Anna")
, так как функция возвращает значение String
, то greet(person:)
может быть обёрнута в вызов print(_:separator:terminator:)
для вывода этой строки и вывода её возвращаемого значения, как указано выше.
print(_:separator:terminator:)
не имеет маркера для своего первого аргумента, а все остальные аргументы опциональны, так как имеют стандартное значение.
greet(person:)
начинается с определения новой константы типа String
под названием greet
и заданием её в простое приветственное сообщение. Это приветствие возвращается назад из функции с использованием ключевого слова return
. На строке кода return greet
функция завершает своё выполнение и возвращает текущее значение greeting
.
greet(person:)
несколько раз с разными входными значениями. Пример выше демонстрирует, что будет, если она вызвана со входным значением "Артём" и входным значением "Женя". Функция возвращает персональное приветствие.
func greetAgain(person: String) -> String {
return "Снова здравствуй, " + person + "!"
}
print(greetAgain(person: "Артём"))
// Выведет "Снова здравствуй, Артём!"
String
вне зависимости от момента вызова:
func sayHelloWorld() -> String {
return "я хочу купить подписку на курсы"
}
print(sayHelloWorld())
// Выведет "я хочу купить подписку на курсы"
Определение функции все так же требует круглых скобок после своего имени, даже если функция не принимает никаких параметров. Имя функции так же сопровождается пустой парой круглых скобок, когда она вызывается.
String
.
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return greetAgain(person: person)
} else {
return greet(person: person)
}
}
print(greet(person: "Эльмира", alreadyGreeted: true))
// Выведет "Снова здравствуй, Эльмира!"
Вы вызываете функцию greet(person:alreadyGreeted:)
, передавая в неё и аргумент типа String
с маркером person
, и аргумент типа Bool
с именем alreadyGreeted
в круглых скобках, разделяя их запятыми. Отметьте, что эта функция отличается от функции greet(person:)
, указанной в примерах ранее. И хотя обе функции имеют название greet
, greet(person:alreadyGreeted:)
принимает два аргумента, но функция greet(person:)
принимает только один.
greet(person:)
, которая печатает само значение String
вместо его возврата:
func greet(person: String) {
print("Здравствуй, \(person)!")
}
greet(person: "Катерина")
// Выведет "Здравствуй, Катерина!"
Так как функции не нужно возвещаемое значение, то её определение не содержит возвращающей стрелки (->) или типа возвращаемого значения.
greet(person:)
всё ещё возвращает значение, хотя никакого возвращаемого значения не определено. Функции без определённого возвращаемого значения возвращают специальное значение типа Void
. Это просто пустой кортеж, который записывается как ().
func printAndCount(string: String) -> Int {
print(string)
return string.characters.count
}
func printWithoutCounting(string: String) {
let _ = printAndCount(string: string)
}
printAndCount(string: "продли подписку в ближайшее время")
// Выведет "продли подписку в ближайшее время" и вернёт значение 12
printWithoutCounting(string: "продли подписку в ближайшее время")
// Выведет "продли подписку в ближайшее время", но не вернёт значения
Первая функция - printAndCount(string:)
- печатает строку и возвращает количество символов в ней в виде значения Int
. Вторая функция - printWithoutCounting(string:)
вызывает первую функцию, но игнорирует её возвращаемое значение. Когда вызывается вторая функция, то сообщение всё еще печатается первой функцией, но возвращаемое значение используется.
minMax(array:)
, которая находит наименьшее и наибольшее числа в массива типа Int
:
func minMax(array: [Int]) -> (min: Int, max: Int) {
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..< array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
Функция minMax(array:)
возвращает кортеж, содержащий два значения типа Int
. Эти значения помечены как min
и max
, так что они могут быть использованы с помощью доступ через их имена, когда запрашивается возвращаемое значение функции.
minMax(array:)
начинается с установки двух рабочих переменных с названиями currentMin
и currentMax
и значениями в первое целое в массиве. Затем функция итерируется через оставшиеся значения в массиве и проверяет каждое значение, чтобы увидеть, больше или меньше оно, чем значения currentMin
и currentMax
соответственно. В итоге и максимальное, и минимальное значения возвращаются в качестве кортежа из двух значений Int
.
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("минимум равен \(bounds.min) и максимум равен \(bounds.max)")
// Выведет "минимум равен -6 и максимум равен 109"
nil
. Вы можете записать опционал-кортеж в качестве возвращаемого типа, поставив знак вопроса после закрывающей круглой скобки у типа кортежа, например, (Int, Int)?
или (String, Int, Bool)?
.
(Int, Int)?
отличается от кортежа, который содержит значения-опционалы, например, (Int?, Int?)
. В типе кортеже-опционале весь кортеж есть опционал, а не просто каждое отдельное значение в кортеже.
minMax(array:)
выше возвращает кортеж, содержащий два значения типа Int
. Однако, функция не выполняет никаких проверок безопасности на полученной массиве. Если аргумент array
содержит пустой массив, то функция minMax(array:)
, описанная выше, выдаст ошибку времени выполнения при попытке получить доступ к array[0]
.
minMax(array:)
с кортежем-опционалом в качестве возвращаемого типа, и вернём значение nil
, когда массив пуст:
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
var currentMin = array[0]
var currentMax = array[0]
for value in array[1.. currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
minMax(array:)
действительный кортеж или nil
:
if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
print("минимум равен \(bounds.min) и максимум равен \(bounds.max)")
}
// Выведет "минимум равен -6 и максимум равен 109"