Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СЕССИЯ ОТВЕТЫ / iOS сессия ответы.docx
Скачиваний:
21
Добавлен:
25.12.2020
Размер:
14.45 Mб
Скачать

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)

Примечание Внешние имена могут быть заданы для произвольных аргументов, не обязательно указывать их для всех.

Соседние файлы в папке СЕССИЯ ОТВЕТЫ