---
Хотя синтаксис 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!
Хотя синтаксис Objective-C может показаться несколько необычным по сравнению с другими языками программирования, синтаксис его методов прост и понятен. Вот краткий обзор прошлого:
+ (void)mySimpleMethod
{
// метод класса
// без параметров
// нет возвращаемого значения
}
- (NSString *)myMethodNameWithParameter1
{
// метод экземпляра
// Первый параметр — указатель на 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!