Multifaceted Functions in Swift

META

Activist
SUPREME
MEMBER
Joined
Mar 1, 2026
Messages
118
Reaction score
380
Deposit
0$
---

Хотя синтаксис Objective-C может показаться несколько необычным по сравнению с другими языками программирования, синтаксис его методов прост и понятен. Вот краткий обзор прошлого:

+ (void)mySimpleMethod
{
// метод класса
// без параметров
// нет возвращаемого значения
}

- (NSString *)myMethodNameWithParameter1:(NSString *)param1 parameter2:(NSNumber *)param2
{
// метод экземпляра
// Первый параметр — указатель на NSString
// Второй параметр — указатель на NSNumber
// Должен возвращать указатель на NSString
return @"hello, world!";
}

В отличие от других языков программирования, синтаксис Swift в целом похож на синтаксис других языков, но временами может быть сложнее и запутаннее, чем в Objective-C.

Прежде чем продолжить, я хочу уточнить разницу между «методами» и «функциями» в Swift, поскольку я буду использовать оба термина на протяжении всей статьи. Вот определение «методов» из книги Apple «Язык программирования Swift»:

Методы — это функции, связанные с определенным типом. Классы, структуры и перечисления могут определять методы экземпляра, которые инкапсулируют конкретные задачи и функциональность для работы с экземпляром заданного типа. Классы, структуры и перечисления также могут определять методы типа, которые связаны с самим типом. Методы типа аналогичны методам класса в Objective-C.

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


---

Анатомия функций Swift

Начнём с простой функции Swift "Hello, World!":

func mySimpleFunction() {
println("hello, world!")
}

Если вы когда-либо программировали на каком-либо языке, кроме Objective-C, это должно показаться вам знакомым.

Ключевое слово func объявляет функцию.

Название функции — mySimpleFunction.

Функция не принимает параметров (пустые скобки).

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

Исполняемый код находится внутри фигурных скобок { }.


Теперь рассмотрим более сложную функцию:

func myFunctionName(param1: String, param2: Int) -> String {
вернуть "привет, мир!"
}

Эта функция принимает параметр param1 типа String и параметр param2 типа Int и возвращает строку.


---

Вызов функций

Одно из главных отличий Swift от Objective-C заключается в способе работы с параметрами при вызове функций. Имена параметров по умолчанию не включаются:

func hello(name: String) {
println("hello \(name)")
}

привет("Мистер Робото")

Всё хорошо, пока вы не добавите больше параметров:

func hello(name: String, age: Int, location: String) {
println("Привет, \(имя). Я тоже живу в \(местоположение). Когда у тебя \(возраст + 1) день рождения?")
}

hello("Мистер Робото", 5, "Сан-Франциско")

Становится неясно, что именно представляет собой каждый из аргументов.

В Swift эта проблема решается с помощью внешних имен параметров:

func hello(name name: String) {
println("hello \(name)")
}

привет(имя: "Робот")

Или используя сокращенный способ записи:

func hello(#name: String) {
println("hello \(name)")
}

привет(имя: "Робот")


---

Вызов методов

Когда функция находится внутри класса (или структуры/перечисления), имя первого параметра не является внешним, а остальные — являются:

класс MyFunClass {
func hello(name: String, age: Int, location: String) {
println("Привет \(имя)...")
}
}

let obj = MyFunClass()
obj.hello("Мистер Робото", age: 5, location: "Сан-Франциско")

Рекомендуется включать первый параметр в имя метода:

func helloWithName(name: String, age: Int, location: String)

Также можно удалить внешние имена с помощью символа _:

func helloWithName(name: String, _ age: Int, _ location: String)


---

Методы экземпляра представляют собой каррированные функции.

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

let helloFunc = MyHelloWorldClass.helloWithName
// Тип: MyHelloWorldClass -> (String) -> String


---

Инициализаторы

Метод `init` — это специальный метод, используемый для инициализации:

класс Person {
init(name: String) {}
}

Человек (имя: "Мистер Робото")

В отличие от других методов, имя первого параметра всегда требуется для внешнего вывода.


---

Специальные параметры

Дополнительные параметры

func myFunc(param: String?) {}

Необязательные параметры могут содержать значение или nil.

Параметры по умолчанию

func hello(name: String = "you") {}

Вариативные параметры

func hello(names: String...) {}

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

func swap(inout a: String, inout b: String) {}


---

Дженерики

func swap<T>(inout a: T, inout b: T) {}


---

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

func lucky(name: String, handler: (String, Int) -> String) -> String {}


---

Контроль доступа

В Swift три уровня:

публичный

внутренний (по умолчанию)

частный



---

Типы возвращаемых значений

Возврат по желанию

func myFunc() -> String? {}

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

func range(numbers: Int...) -> (min: Int, max: Int)


---

Функции, возвращающие функции

func makeFunc() -> (Int) -> String


---

Вложенные функции

func outer() {
func inner() {}
}


---

Заключение

Функции Swift обладают огромной мощностью и гибкостью. Но с большой мощностью приходит и ответственность — ставьте читаемость выше оригинальности.

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

Удачного программирования на Swift! 🚀
 
Top Bottom