Swift. Входные параметры и возвращаемое значение функции

From AsIsWiki
Revision as of 06:53, 25 May 2022 by Alex (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Назад · Оглавление · Дальше


Contents

Входные параметры

Функция сложения двух целых чисел:

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



Назад · Оглавление · Дальше

Personal tools
Namespaces

Variants
Actions
Navigation
Tools