betacode

Руководство Swift Function

  1. Определение Function
  2. Правила вызова функции, метода 
  3. Function возвращает значение
  4. Функция возвращает много значений
  5. Функция с параметром Variadic
  6. Функция внутри функции
  7. Вид функции (Function Type)
  8. Функция возвращает функцию

1. Определение Function

В Swift, функция определяется ключевым словом "func", функция имеет определенное название, функция может имет 0 или более параметров, или не имеет вид возврата.
Синтаксис определяющий функцию:
// Функция имеет вид возврата
// ​​​​​​​
func functionName(parameters) -> returntype  
{
   // Statements....
    return value;
} 
// Функция не имеет вид возврата
func functionName(parameters)
{
    // Statements...
}
Это функция с названием sayHello, имеет параметр вида String, и возвращает String.
MyFirstFunction.swift
import Foundation

// Определить функцию (function)
// Название функции: sayHello
// Параметр: name, вид String
// Возвращает (return): String
func sayHello(name:String) -> String { 
    // Если 'name' пустой (empty).
    if name.isEmpty  {
        // Вернуть, и завершить функцию.
        return "Hello every body!"
    }
    // Если 'name' не пустой, данный код будет выполнен.
    return "Hello " + name 
} 
// Определить функцию, не имеющую параметр, не имеющую вида возврата.
func test_sayHello()  { 
    // Вызвать функцию sayHello, передать в пустой String.
    var greeting1 = sayHello("")  
    print("greeting1 = " + greeting1);
    
    // Вызвать функцию sayHello, передать значение параметру как "Swift".
    var greeting2 = sayHello("Swift") 
    print("greeting2 = " + greeting2); 
}
Изменить исходный файл main.swift чтобы протестировать функцию, только что созданную вами.
main.swift
import Foundation

// Вызвать функцию test_sayHello()
test_sayHello()
Запуск примера:
greeting1 = Helloo everybody!
greeting2 = Hello Swift

2. Правила вызова функции, метода 

Swift 2.1 дает правило вызова функции, далее указаны правила:
  • Первый параметр переданный функции (или методу) не требует метку (Label) для аргумента
  • Другие параметры переданные функции (или методу) требуют метку аргумента.
  • Все параметры переданные в Constructor требуют метку (Label) для аргумента.
RulesCallFunc.swift
import Foundation

// name1, name2 являются марками (Label).
func sayHello(name1: String, name2: String)   { 
    print("Hello " + name1);
    print("Hello " + name2); 
}  
func test_sayHello()    {  
    let tom = "Tom"
    let jerry = "Jerry"
    
    // Правило вызова функции (Или метода):
    // Первый параметр не требует марки (Label)
    // Другие параметры требуют наличие марки.
    sayHello(tom, name2: jerry)  
}

3. Function возвращает значение

Команда return в параметре останавливает выполнение функции и возвращает значения из этой функции.
FunctionExample1.swift
import Foundation

// Определить функцию для суммирования 3 чисел Int, возвращает вид Int.
func sum(a: Int, b: Int, c: Int) -> Int  { 
    // Объявить переменную вида Int.
    var ret:Int = a + b + c 
    return ret 
}  
// Определить функцию для поиска наибольшего числа среди 3 чисел.
func max(a: Int, b: Int, c: Int) -> Int { 
    // Объявить переменную 'm', прикрепить к ней значение 0.
    var m = a
    
    // Проверить если m < b то прикрепить m = b.
    if m < b  {
        m = b
    } 
    // Если m > c то вернуть (return) m.
    if m >  c  { 
        // Завершить функцию
        return m;
    } 
    return c 
}

4. Функция возвращает много значений

В Swift функция может возвращать много значений, на самом деле, эта функция возвращает Tuple (Кортежи), Tuple это ряд значений поставленных в ( ), и отделяются запятой. Каждое значение имеет название чтобы иметь доступ.
ReturningTupleExample.swift
import Foundation

// Определить функцию с названием getMinMax
// Вход является массивом чисел Int.
// Данная функция возвращает 2 значения:
// Наибольшее и наименьшее число в массиве.
func getMinMax(arr: [Int]) -> (min: Int, max: Int)   { 
    // Если массив не имеет элементов, то возвращает (0,0).
    if arr.count == 0  {
        // Завершить функцию.
        return (0, 0)
    } 
    // Объявить 2 переменные 'mi', 'ma'
    // Прикрепить значение первого элемента в массиве для них.
    var mi: Int = arr[0]
    var ma: Int = arr[0]  
    for a in arr  { 
        if mi > a  {
            mi = a
        }
        if  ma  <  a  {
            ma = a
        }
    } 
    return (mi, ma)
} 
// Тест функции getMinMax.
func test_returningTupleExample()    { 
    // Массив чисел Int.
    var years: [Int] = [2000, 1989, 1975, 2005, 2016] 
    // Вызвать функцию getMinMax.
    var y = getMinMax(years) 
    print("Max = \(y.max)") 
    print("Min = \(y.min)")  
}
Поменять исходный файл main.swift чтобы протестировать пример:
main.swift
import Foundation

test_returningTupleExample()
Запуск примера:
Max = 2016
Min = 1975

5. Функция с параметром Variadic

Swift использует "variableName: DataType..." чтобы отметить один параметр Variadic. Смотрите пример ниже про функцию с параметром Variadic и как использовать эту функцию.
VariadicParamsFunction.swift
import Foundation

// Функция с параметрами Variadic: nums
// Параметр nums: Похожий на массив чисел Int.
func sum(nums: Int...) -> Int { 
    var retNumber : Int = 0  
    for n in nums {
        retNumber = retNumber + n
    } 
    return retNumber 
} 
// Использовать функцию, с параметром Variadic:
func test_sum()    { 
    // Вызвать функцию sum, передать 3 параметра.
    var sum1 = sum(1, 2, 3) 
    print("sum(1, 2, 3) = \(sum1)") 
    // Вызвать функцию sum, передать 4 параметра.
    var sum2 = sum(1,4, 5, 7) 
    print("sum(1,4, 5, 7) = \(sum2)") 
}
Запуск пример:
sum(1, 2, 3) = 6
sum(1, 4, 5, 7) = 17

6. Функция внутри функции

Swift позволяет вам написать функцию внутри другой функции, данная функция используется в родительской функции.
NestedFunction.swift
import Foundation

// Функция возвращает налог, основываясь на коде страны и заработной плате.
func getTaxAmount(countryCode:String, salaryAmount:Int) -> Int  { 
    // Функция считает налог в Америке.
    func getUsaTaxAmount( salaryAmount: Int)  -> Int {
        // 15%
        return 15*salaryAmount/100
    }  
    // Функция считает налог во Вьетнаме.
    func getVietnamTaxAmount( salaryAmount:Int)  -> Int {
        // 10%
        return 10 * salaryAmount/100
    } 
    if countryCode == "US" { 
        return getUsaTaxAmount(salaryAmount) 
    } else if countryCode == "VN" { 
        return getVietnamTaxAmount(salaryAmount) 
    } 
    // Другие страны (5%)
    return  5 * salaryAmount / 100 
}

7. Вид функции (Function Type)

В Swift каждая функция имеет вид функции, посмотрим на следующую функцию:
func sum(a: Int,  b: Int)  -> Int   {
    return a + b;
}
Вид функции:
(Int,Int) -> (Int)

8. Функция возвращает функцию

ReturningFunction.swift
import Foundation

// Функция считает налог в Америке.
// Вид функции: (Int) -> (Int)
func getUsaTaxAmount(salary: Int)  -> Int { 
    return 15 * salary / 100
} 
// Функция считает налог во Вьетнаме.
// Вид функции: (Int) -> (Int)
func getVietnamTaxAmount(salary: Int) -> Int  { 
    return 10 * salary / 100
} 
// Функция считает налог по умолчанию.
// Вид функции: (Int) -> (Int)
func getDefaultTaxAmount(salary: Int) -> Int { 
    return 5 * salary / 100
} 
// Данная функция возвращает функцию
func getTaxFunction(countryCode: String) ->  ( Int -> Int )  { 
    if countryCode == "US"  {
        return getUsaTaxAmount 
    } else if countryCode == "VN"  { 
        return getVietnamTaxAmount
    }
    return getDefaultTaxAmount 
}  
// Test
func  test_returningFunction()  { 
    var countryCode = "US"
    print("Country Code = " + countryCode) 
    // Get function.
    var taxFunction =  getTaxFunction(countryCode)  
    var salary = 10000 
    print("Salary = \(salary)")
    
    var taxAmount = taxFunction(salary) 
    print("Tax Amount = \(taxAmount)")
}
Изменить main.swift для теста примера:
main.swift
import Foundation 
test_returningFunction()
Запуск примера:
Country Code = US
Salary = 10000
Tax Amount = 1500