English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift базовый учебник

Операторы Swift

Swift управление потоком

Swift коллекции

Swift функции

Swift продвинутый

Параметры и значения функции в Swift

В этой статье вы узнаете о различных пользовательских функциях, которые будут получать различные типы входных данных и возвращать выходные данные с помощью примеров.

в предыдущей статьеSwift функцииМы уже рассмотрели функции. Теперь мы рассмотрим различные способы и типы создания функций в Swift, а именно обработку входных и выходных данных в функциях.

Функции без параметров и возвращаемого значения

Эти типы функций не принимают ни одного входного и возвращаемого значения.

func funcname() {
    //Сущность
}
или
func funcname() -> () {
    //Сущность
}
или
func funcname() -> Void {
    //Сущность
}

Все приведенные выше грамматики действительны для создания функций без параметров и возвращаемого значения.

Приведенная выше грамматика func funcname()->() также эквивалентна func funcname()->void, так как void — это просто тип别名 для (). Вы можете посетитьSwift типы алиасовдля получения дополнительной информации.

Пример 1: нет переданных параметров и возвращаемого значения

func greetUser() {
    print("Доброе утро!")
}
greetUser()

Когда вы запустите вышеуказанную программу, вывод будет следующим:

Доброе утро!

Функции без параметров, но с возвращаемым значением

Эти функции не принимают никаких входных параметров, а возвращают значение. Чтобы добавить тип возвращаемого значения, нужно добавить стрелку (->) и тип возвращаемого значения.

func funcname() -> ReturnType {
    //Сущность
    return value
}

Пример 2: передача параметра без возвращаемого значения

func greetUser() -> String {
    return "Доброе утро!"
}
let msg = greetUser()
print(msg)

Когда вы запустите вышеуказанную программу, вывод будет следующим:

Доброе утро!

В указанном выше примере вы определили тип возвращаемого значения как String. Теперь, эта команда должна возвращать строку изнутри функции, в противном случае будет выброшена ошибка.

Ключевое слово return передаёт управление в программе от тела функции к вызову функции. Если нужно вернуться из функции значение, добавьте возвращаемое значение после ключевого слова return.

return "Доброе утро!" возвращает значение типа String. Обратите внимание, что тип и значение возвращаемого значения должны соответствовать.

Вы также можете分配 возвращаемое значение переменной или константе. let msg =assigns returned value to the constant msg. Таким образом, команда print(msg) выводит"Доброе утро!".

Если вы хотите пропустить это значение, просто используйте подчеркивание _, например, let _ =.

Функции с параметрами, но без возвращаемого значения

Параметры используются для ввода в функции. Параметр включает имя параметра и тип, за которым следует двоеточие (:). Эти функции используют входные параметры, но не возвращают значения.

func funcname(parameterName:Type) {
    //Сущность
}

Пример 3: передача параметра без возвращаемого значения

func greetUser(msg:String) {
    print(msg)
}
greetUser(msg: "Доброе утро!")

Когда вы запустите вышеуказанную программу, вывод будет следующим:

Доброе утро!

В указанном выше программе функция принимает один параметр типа строки. Параметр используется только внутри функции. msg - это имя параметра.

Вы можете вызвать функцию greetUser(msg: "Доброе утро!") bằng передаче строкового значения параметра msg. Имя параметра видимо только в функции greetUser().

Таким образом, команда print(msg) выводит "Доброе утро!".

Функции с параметрами и возвращаемыми значениями

Эти функции используют параметры и возвращают значения.

func funcname(parameterName:Type) -> ReturnType {
    //Сущность
}

Пример 4: Передача параметров и возвращение значений

func greetUser(name: String) -> String {
    возврат "Good Morning! " + name
}
let msg = greetUser(name: "Jack")
print(msg)

Когда вы запустите вышеуказанную программу, вывод будет следующим:

Good Morning! Jack

В этом программном обеспечении функция принимает один параметр типа String и также возвращает значение типа String “Good Morning! Jack”.

Функции с множественными параметрами и множественными возвращаемыми значениями

Эти типы функций принимают несколько параметров, разделенных запятыми, и также возвращают несколько значений. Вы можете использовать кортеж для возвращения нескольких значений в Swift.

func funcname(parameterName: Type, parameterName2: Type, ...) -> (ReturnType, ReturnType...) {
    //Сущность
}

Пример 5: Передача множественных параметров и множественных возвращаемых значений

func greetUser(name: String, age: Int) -> (String, Int) {
    
    let msg = "Good Morning!" + name
    var userage = age
    if age < 0 {
            userage = 0
    }
    возврат (msg, userage)
}
let msg = greetUser(name: "Jack", age: -2)
print(msg.0)
print("У вас осталось \(msg.1) монет")

Когда вы запустите вышеуказанную программу, вывод будет следующим:

Good Morning!Jack
У вас осталось 0 монет

В этом программном обеспечении функция greetUser() принимает несколько параметров типа String и Int. Эта функция также возвращает несколько значений, типа String и Int.

Чтобы получить доступ к каждому возвращаемому значению, мы используем индексные позиции 0, 1, ... Здесь мы используем msg.0 для доступа к “Good Morning!Jack” и msg.1 для доступа к “0”.

Иногда использование индексных позиций может быть не интуитивным и нечитаемым. Мы можем решить эту проблему элегантно,命名 возвращаемые значения. Программа также может быть переписана следующим образом.

Пример 6: Множественные возвращаемые значения с именами

func greetUser(name: String, coins: Int) -> (name: String, coins: Int) {
    
    let msg = "Good Morning!" + name
    var userCoins = coins
    if coins < 0 {
        userCoins = 0
    }
    return (msg, userCoins)
}
let msg = greetUser(name: "Jack", coins: -2)
print(msg.name)
print("У вас осталось \(msg.coins) монет")

В этом приложении тип возвращаемого значения является кортежем, который содержит имена переменных этого типа. Основным преимуществом этого является то, что вы можете использовать имена переменных msg.name и msg.coins вместо msg.0 и msg.1 для доступа к результатам.

Функция с параметрами-метками

При определении функции,接受的 вход, можно определить имя входа с помощью имени параметра. Но есть и другое имя, которое можно использовать вместе с именем параметра, и это имя параметра-метки.

Использование параметра-метки позволяет вызывать функцию в экспрессивном стиле, подобном предложению, при этом обеспечивая читаемость и ясность намерений тела функции.

У каждого параметра функции есть параметр-метка и имя параметра. По умолчанию параметр использует его имя параметра в качестве параметра-метки. Но если вы明确规定 имя параметра, то при вызове функции будут использоваться параметр-метки.

Синтаксис функции с именами параметров:

func funcname(argumentLabel parameterName: Type) -> Return Type {
    //Сущность
}

Давайте рассмотрим это на следующем примере.

Пример 7: функция без имен параметров

func sum(a: Int, b: Int) -> Int {
    
    return a + b
}
let result = sum(a: 2, b: 3)
print("Сумма равна \(result)")

Когда вы запустите вышеуказанную программу, вывод будет следующим:

Сумма равна 5

В предыдущем примере мы не указали имена параметров, поэтому при вызове функции будут использоваться именные параметры по умолчанию a и b.

Когда вы вызовете функцию, вы можете заметить, что вызов функции не является экспрессивным/предложением. Если вы можете установить вызов функции как:

let result = sum(of: 2, and: 3)

Теперь давайте изменим функцию на:

Пример 8: функция с更好的 вызовом, но без имен параметров

func sum(of: Int, and: Int) -> Int {
    return of + and
}
let result = sum(of: 2, and: 3)
print("Сумма равна \(result)")

Теперь метод вызова может быть выражен. Но теперь我们必须 использовать имена параметров of&and и return of + and, чтобы найти сумму двух чисел. Это делает тело функции менее читаемым. Использование a и b вместо of&and будет более значимым.

Для этого我们必须将参数标签明确定义为:

Пример 9: Функция с метками параметров

func sum(of a :Int, and b:Int) -> Int {
    return a + b
}
let result = sum(of: 2, and: 3)
print("Сумма равна \(result)")

В вышеуказанной программе функция принимает два параметра типа Int. Вызов функции использует метки параметров of&and, что означает вызов функции sum(of: 2, and: 3), а не sum(a: 2, b: 3).

Кроме того, в теле функции используются имена параметров a и b, а не of&and, что также имеет смысл при применении операций.

Вы также можете пропустить метки параметров, написав перед именем параметра подчеркивание _.

func sum(_ a :Int, _ b:Int) -> Int {
    return a + b
}
let result = sum(2, 3)
print("Сумма равна \(result)")

Функция с параметрами по умолчанию

Вы можете предоставить значение по умолчанию любому параметру функции, определив значение после типа параметра. Предоставление значения по умолчанию позволяет вам пропустить параметр при вызове функции.

Если при вызове функции не передается значение параметру, то используется его значение по умолчанию. Однако, если при вызове передается значение параметру явно, то используется указанное значение.

func funcname(parameterName:Type = value) -> Return Type {
    //Сущность
}

Пример 10: Функция с параметрами по умолчанию

func sum(of a :Int = 7, and b:Int = 8) -> Int {
    return a + b
}
let result1 = sum(of: 2, and: 3)
print("Сумма равна \(result1)")
let result2 = sum(of: 2)
print("Сумма равна \(result2)")
let result3 = sum(and: 2)
print("Сумма равна \(result3)")
let result4 = sum()
print("Сумма равна \(result4)")

Когда вы запустите вышеуказанную программу, вывод будет следующим:

Сумма равна 5
Сумма равна 10
Сумма равна 9
Сумма равна 15

В上面的 программе функция sum(of a :Int = 7, and b:Int = 8) -> Int принимает два параметра типа Int и specifies по умолчанию значения параметров a=7 и b=8.

Если передать значение value в вызове функции sum(of: 2, and: 3), то используется2и3вместо значения по умолчанию параметра.

Но если вы не передадите значение параметра в sum(), то будут использованы значения по умолчанию 7 и 8 в качестве параметров.

Функция с переменными параметрами

Переменные параметры могут принимать ноль или несколько значений определенного типа. Вы можете определить переменный параметр, добавив три точки (...) после типа параметра.

Когда необходимо передавать различные количества входных значений параметрам при вызове функции, обычно используется переменный параметр. Например, список чисел, список букв и т.д.

Синтаксис функции с переменными параметрами:

func funcname(parameterName: Type...) -> Return Type {
    //Сущность
}

Пример 11: Функция с переменными параметрами

func sum(of numbers: Int...) {
    var result = 0
    for num in numbers {
        result += num
    }
    print("Сумма чисел составляет \(result)")
}
sum(of: 1, 2, 3, 4, 5, 6, 7, 8)

В указанном выше примере функция sum(of numbers: Int...) принимает переменные параметры типа Int. Переменные параметры могут принимать несколько значений, разделенных запятыми, sum(of: 1, 2, 3, 4, 5, 6, 7, 8).

Значения, передаваемые как переменные параметров1, 2, 3, 4, 5, 6, 7, 8В теле функции их можно использовать как массив типа Int. Таким образом, мы можем применить цикл for-in в виде for num in numbers.

Когда вы запустите вышеуказанную программу, вывод будет следующим:

Сумма чисел составляет 36

Обратите внимание: встроенная функция print() в Swift также принимает параметры любого типа.

Any представляет собой любой тип данных в Swift, например Int, Float, Double, String и т.д.

Функция с вводно-выводными параметрами

При определении параметров функции не допускается их изменение в теле функции. Поэтому по умолчанию они являются константами. Давайте посмотрим на пример:

func process(name: String) {
    if name == ""{
        name = "guest"
    }
}

Указанный выше код приведет к ошибке компиляции, потому что вы не можете изменить значение параметра.

Если нужно, чтобы функция изменяла значение параметра, то параметр необходимо определить как in-out параметр. Вы можете записать ввод/вывод параметра, поместив ключевое слово inout перед типом параметра.

В фоновом режиме параметр in-out имеет значение, которое передается в функцию, изменяется функцией, а затем передается обратно, чтобы заменить исходное значение. Поэтому переданные в вызове функции значения не могут быть константами. Их необходимо声明 в виде переменных.

Синтаксис функции с параметром in-out выглядит следующим образом:

func funcname(parameterName: inout Type) -> Return Type {
    //Сущность
}

Пример 12: Функция с параметром in-out

func process(name: inout String) { 
    if name == ""{
        name = "guest"
    }
}
var userName = ""
process(name: &userName)
print(userName)

Когда вы запустите вышеуказанную программу, вывод будет следующим:

guest

В上面的 программе мы объявили функцию, принимающую параметр in-out, чтобы можно было изменить/изменить параметр name в теле функции.

При передаче параметров в in-out параметры, перед именем переменной необходимо напрямую использовать символ & для того, чтобы функция могла изменить его.