Swift. Входные параметры и возвращаемое значение функции
Назад · Оглавление · Дальше
Входные параметры
Функция сложения двух целых чисел:
func sum(a:Int, b: Int) { print("Сумма: \(a + b)") } sum(a: 10, b: 2) Консоль: Сумма: 12
Функции необходимо передавать аргументы для всех объявленных параметров:
sum(a: 10) // error: missing argument for parameter 'b'
Внешние имена входных параметров
func sum(num1 a:Int, num2 b: Int) { print("Сумма: \(a + b)") } sum(num1: 10, num2: 2)
Убираем имена параметров, при вызове функции:
func sum(_ a:Int, _ b: Int) { print("Сумма: \(a + b)") } sum(10, 2)
Внешние и подавляемые имена параметров можно указывать произвольно.
Возвращаемое значение
Добавим функции sum(_:_:) возможность возвращать результат:
func sum(_ a:Int, _ b: Int) -> Int { let result = a + b print("Сумма: \(result)") return result } sum(10, 2) // 12
Изменяемые копии входных параметров
Входные параметры функции являются константами:
func inc(_ a:Int) -> Int { a += 1 // ошибка! входной параметр a - константа return a }
Исправляем:
func inc(_ a:Int) -> Int { var b = a b += 1 return b } inc(100) // 101
Сквозные параметры
Обмен значениями двух параметров:
func swapInt(_ a: inout Int, _ b: inout Int) { let tmp = a; a = b; b = tmp } var a = 123 var b = 321 swapInt(&a, &b) // передача аргумента по ссылке a // 321 b // 123 // swap(&a, &b) - стандартная функция обмена значениями
Сквозной параметр может принимать только переменную.
Константы и литералы передавать в функцию через сквозные параметры нельзя.
Функция в качестве входного аргумента
Функция createMsg передается функци print в качестве входного аргумента:
func createMsg(code: Int, message: String) -> String { return "Получено сообщение \"\(message)\" с кодом \(code)" } print(createMsg(code: 200, message: "Сервер доступен")) Консоль: Получено сообщение "Сервер доступен" с кодом 200
Входной параметр с переменным числом аргументов
Если количество однотипных аргументов заранее неизвестно:
func sum(numbers: Int...) -> Int { // numbers - вариативный параметр var sum = 0 for num in numbers { sum += num } return sum } sum(numbers: 10, 20, 30, 40) // 100 sum(numbers: 100, 25) // 125
numbers может содержать произвольное количество значений.
Внутри функции, numbers трактуется как последовательность (Sequence).
У функции может быть несколько вариативных параметров:
func f(a:Int..., b:Int...) -> Int { var s = 0 a.forEach{s += $0} b.forEach{s += $0} return s } f(a:1,2,3, b:1,2,3) // 12
Позиция вариативного параметра в общем списке параметров может быть произвольной.
Кортеж в качестве возвращаемого значения
Функция принимает код ответа сервера и возвращает кортеж с его описанием:
func getCodeDescription(code: Int) -> (Int, String) { let description: String switch code { case 1...100: description = "Error" case 101...200: description = "Correct" default: description = "Unkonown" } return (code, description) } print(getCodeDescription(code: 150)) Консоль: (150, "Correct")
Добавляем в кортеж имена элементов:
func getCodeDescription(code: Int) -> (code:Int, description:String) { ... } let request = getCodeDescription(code: 50) request.code // 50 request.description // "Error"
Значение по умолчанию для входного параметра
Все входные параметры функции должны иметь значения.
Значение по умолчанию позволяет не передавать аргумент при вызове функции:
func f(a: Int = 0, b: Int = 0) -> Int { return a + b } f() // 0 f(a:2) // 2 f(b:3) // 3 f(a:2, b:3) // 5
Добавим в функцию createMsg значение по умолчанию для второго параметра:
func createMsg(code: Int, message: String = "") -> String { let msg = message.isEmpty ? "" : "\"" + message + "\" " return "Получено сообщение \(msg)с кодом \(code)" } createMsg(code: 50) // "Получено сообщение с кодом 50" createMsg(code: 50, message: "Ошибка") // "Получено сообщение "Ошибка" с кодом 50"
Примеры
Обмен значениями:
func f(_ a:Int, _ b:Int) -> (Int, Int) { return (b, a) } var a = 1 var b = 2 (a, b) = f(a, b) a // 2 b // 1
Обмен значениями без функции:
var a = 1 var b = 2 (a, b) = (b, a) a // 2 b // 1
Подсчет суммы в кошельке:
func walletSum(_ wallet: [Int]) -> Int { var sum = 0 for banknote in wallet { sum += banknote } return sum } var wallet = [50, 100, 100, 500, 50, 1000, 5000, 50, 100] walletSum(wallet) // 6950 wallet.append(1000) walletSum(wallet) // 7950
Добавляем значение по умолчанию для параметра wallet:
func walletSum(_ wallet: [Int]? = nil) -> Int? { // nil - значение по умолчанию для wallet var sum = 0 guard wallet != nil else { return nil } for banknote in wallet! { sum += banknote } return sum } var wallet = [50, 100, 100, 500, 50, 1000, 5000, 50, 100] walletSum(wallet) // 6950 walletSum() // nil walletSum([]) // 0
Добавляем внешнее имя banknotes для параметра wallet:
func walletSum(banknotes wallet: [Int]? = nil) -> Int? { ... } var wallet = [50, 100, 100, 500, 50, 1000, 5000, 50, 100] walletSum(banknotes: wallet) // 6950 walletSum() // nil walletSum(banknotes: []) // 0
Назад · Оглавление · Дальше