Руководство Swift Function
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