- •Объявление, инициализация и изменение значения. Виды операторов. Переменные и константы. Виды объектов.
- •Типы данных
- •4. Числовые типы данных. Арифметические операторы. Приведение числовых типов данных.
- •5. Текстовые типы данных. Инициализация строковых значений. Приведение к строковому типу данных. Объединение строк.
- •6. Логические значения. Логические операторы.
- •Как проверить, есть ли значение в переменной с опциональным типом данных?
- •12* Операторветвления switch. Fallthrough. Where.
- •13.Сұрақ. Кортежи в операторе switch
- •Наборы: объявление набора, создание пустого набора, доступ к набору и модификация набора.
- •Оператор while
- •Оператор repeatwhile
- •24 Функции: объявление, синтаксис вызова функции. Примеры.
- •Заметка
- •25.Входные аргументы и возвращаемое значение
- •Глава 15 • Функции 245
- •26 Функция в качестве входного аргумента
- •27.Кортеж в качестве возвращаемого значения
- •28. Функционалдымүмкіндіктер. Функционалдытүрі. Функция аргумент ретінде.
- •29. Күрделіфункционалды тип. Қайтарумәніретінде функция
- •30. Кірістірілгенфункциялар. Функциянышамадантысжүктеу.
- •31. Рекурсивный вызов функций. Безымянные функции.
- •32.Замыкания. Функция как замыкания
- •33. Замыкание.Замыкающие выражение
- •Неявные возвраты из замыканий с одним выражением
- •Сокращенные имена аргументов
- •Создание нового отсортированного массива#
- •Сортировка существующего массива на месте#
- •Сортировка массива с пользовательским заказом#
- •38.Объектно-ориентированное программирование в Swift. Экземпляры
- •43. Собственны еинициализаторы
- •44. Методы в структурах
- •45.Сыныптар құрылымдарға өте ұқсас, бірақ олар бірнеше маңызды нүктелермен ерекшеленеді.
- •Переопределение свойств
- •52.Псевдоним Any.Приведение типа Any.Псевдоним AnyObject
- •53.Инициализаторы
- •54.Деинициализаторы
- •Создание Auto Layout и его составляющих
- •. Понятие Segues. Виды Segues.
- •59. Создание программируемых переходов. (ProgrammaticSeguesiniOs)
- •60 .Передачаданныхмеждуконтроллерами. (Passing Data Between Controllers)
- •Отображение данных в мобильном приложении ввиде списка. Работа с таблицами в iOs (Working With Tables)
- •Понятие делегата и протокола на примере работы с таблицами. Назначение и принцип работы. (Table delegates and protocols)
- •Опциональные протоколы
- •Использование протоколов
- •Делегаты
- •Создание и отображение данных в ячейках (Creating custom table cell)
- •Принципы работы с Core Data (Working With Core Data, Saving to Core Data, Fetching data from Core Data, Deleting items from Core Data)
- •Понятие и назначение rest & crud (Understanding rest & crud)
- •67.Асинхронды
- •68. Создание post запросов (Making post requests)
- •Размеры и другие детали внешнего исполнения[править | править код]
26 Функция в качестве входного аргумента
Вы можете использовать возвращаемое некоторой функцией значение в качестве значения входного аргумента другой функции. Самое важное, чтобы тип возвращаемого значения функции совпадал с типом входного параметра.
В листинге 15.8 используется объявленная ранее функция returnMessage(code:message:), возвращающая значение типа String.
Листинг 15.8
// используем функцию в качестве значения
print( returnMessage(code: 400, message: "Сервернедоступен. Код
сообщения - ") )
Консоль
Сервер недоступен. Код сообщения - 400
Уже известная нам функция print(_:) принимает на входе строковый литералтипа String. ТаккакфункцияreturnMessage(code:message:) возвращает значение этого типа, она может быть указана в качестве входного аргумента для print(_:).
Входной параметр с переменным числом аргументов
В некоторых ситуациях необходимо, чтобы функция получала неизвестное заранее число однотипных аргументов. Мы уже встречались с таким подходом при использовании Array(arrayLiteral:), когда заранее неизвестно, сколько элементов будет содержать аргумент arrayLiteral. Такой тип входного аргумента называется вариативным. Вариативный аргумент обозначается в списке входящих параметров с указанием оператора диапазона ... сразу после типа. Значения для этого аргумента при вызове функции задаются через запятую. Рассмотрим пример из листинга 15.9. Представьте, что удаленный сервер на каждый запрос отправляет вам несколько ответов. Каждый ответ — это целое число, но их количество может быть различным. Вам необходимо написать функцию, которая принимает на входе все полученные ответы и выводит их на консоль.
Листинг 15.9
funcprintRequestString(codes: Int...) -> () {
varcodesString = ""
for oneCode in codes {
codesString += String(oneCode) + " "
}
print("Полученыответы — \(codesString)")
}
printRequestString(codes: 600, 800, 301)
printRequestString(codes: 101, 200)
Консоль
Получены ответы — 600 800 301
Получены ответы — 101 200
Параметр codes может содержать произвольное количество значений
указанного типа. Внутри функции он трактуется как последовательность (Sequence), поэтому его можно обработать с помощью конструкции for-in. У одной функции может быть только один вариативный параметр, и он должен находиться в самом конце списка входных аргументов.
27.Кортеж в качестве возвращаемого значения
Функция может возвращать значения любого типа данных. Отдельно отмечу, что и кортежи могут быть использованы для этого, так как с их помощью можно с легкостью вернуть сразу несколько значений (возможно, именно этого вам не хватало в других языках программирования, лично мне не хватало ). Представленная в листинге 15.10 функция принимает на вход код ответа сервера и, в зависимости от того, к какому диапазону относится переданный код, возвращает кортеж с его описанием.
Листинг 15.10
funcgetCodeDescription(code: Int) -> (Int, String){
let description: String
switch code {
case 1...100:
description = "Error"
case 101...200:
description = "Correct"
250 Часть IV. Основные возможности Swift
default:
description = "Unknown"
}
return (code, description)
}
getCodeDescription(code: 150) // (150, "Correct")
В качестве типа возвращаемого значения функци и getCodeDescription(code:) указан тип кортежа, содержащего два значения: код и его описание. Функцию getCodeDescription(code:) можно улучшить, если указать не просто тип возвращаемого кортежа, а названия его элементов (прямо в типе возвращаемого функцией значения) (листинг 15.11).
Листинг 15.11
funcgetCodeDescription(code: Int)
-> (code: Int, description: String){
let description: String
switch code {
case 1...100:
description = "Error"
case 101...200:
description = "Correct"
default:
description = "Unknown"
}
return (code, description)
}
let request = getCodeDescription(code: 45)
request.description // "Error"
request.code // 45
Полученное в ходе работы getCodeDescription(code:) значение записывается в константу request, у которой появляются свойства description и code, что соответствует именам элементов возвращаемого кортежа.
Значение по умолчанию для входного аргумента
Напомню, что все входные аргументы должны обязательно иметь значения. Ранее для этого мы указывали их при вызове функции. Но существует возможность определить значения по умолчанию, которые позволяют не указывать значения при вызове. Другими словами: если вы передали значение входного аргумента, то оно будет использовано в теле функции; если вы не передали значение аргумента, для него будет использовано значение по умолчанию. Значение по умолчанию указывается при объявлении функции в списке входных аргументов для каждого параметра отдельно.
Доработаем объявленную ранее функцию returnMessage(code:message:) таким образом, чтобы была возможность не передавать значение аргумента message. Для этого укажем значение по умолчанию (листинг 15.12).
Листинг 15.12
funcreturnMessage(code: Int, message: String = "Код - ") -> String {
varmutableMessage = message
mutableMessage += String(code)
return mutableMessage
}
returnMessage(code: 300) //"Код - 300"
Каквыможетевидеть, привызовеreturnMessage(code:message:) не передаетсязначениедляаргумента message. Это стало возможным благодаря установке значения по умолчанию "Код - " в списке входных параметров.
Внешние имена входных аргументов
Аргументы a и b функции sumTwoInt(a:b:) используются как при вызове функции, так и в ее теле. Swift позволяет указать внешние имена параметров, которые будут использоваться при вызове функции
Листинг 15.3
funcsumTwoInt(num1 a: Int, num2 b: Int){
print("Результат операции - \(a+b)")
}
sumTwoInt(num1: 10, num2: 12)
Теперь при вызове функции sumTwoInt(num1:num2:) необходимо указывать значения не для безликих a и b, а для более-менее осмысленных num1 и num2. Данный прием очень полезен, так как позволяет задать понятные и соответствующие контексту названия входных аргументов, но при этом сократить количества кода в теле, используя краткие внутренние имена. Если внешнее имя заменить на символ нижнего подчеркивания (_), то при вызове функции имя параметра вообще не потребуется указывать
Листинг 15.4
funcsumTwoInt(_ a: Int, _ b: Int){
print("Результат операции - \(a+b)")
}
sumTwoInt(10, 12)
Примечание Внешние имена могут быть заданы для произвольных аргументов, не обязательно указывать их для всех.