Функция — это самостоятельный блок кода, который выполняет определенную задачу и существует независимо от классов или структур. Функции являются глобальными сущностями.
Метод — это функция, ассоциированная с конкретным классом, структурой или перечислением. Методы определяют поведение и функциональность типа, к которому они принадлежат.
// Функция (не принадлежит ни к какому типу)
func greet(name: String) -> String {
return "Hello, \(name)!"
}
// Метод (принадлежит структуре)
struct Person {
var name: String
func greet() -> String {
return "Hello, my name is \(name)!"
}
}
Методы имеют доступ к свойствам и другим методам своего типа через self
:
struct Counter {
var count = 0
mutating func increment() {
count += 1 // Доступ к свойству
}
}
Функции не имеют такого доступа по умолчанию.
Методы наследуют модификаторы доступа своего типа:
internal class MyClass {
private func secretMethod() {} // private метод
}
Функции объявляют свой уровень доступа явно.
Методы могут иметь специфические особенности:
mutating
для структур/перечисленийstatic
/class
методыПример mutating метода:
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
// Функция
let greeting = greet(name: "Alice")
// Метод
let person = Person(name: "Bob")
let introduction = person.greet()
Функции первого класса: В Swift функции являются объектами первого класса — их можно присваивать переменным, передавать как аргументы и возвращать из других функций.
let function = greet // Присваивание функции
function("Charlie")
Методы экземпляра vs методы типа:
class MyClass {
class func classMethod() {}
static func staticMethod() {}
func instanceMethod() {}
}
@discardableResult: Может применяться как к функциям, так и к методам.
Используйте функции когда:
Используйте методы когда:
Основное отличие между функцией и методом заключается в их принадлежности и контексте. Функции — это независимые глобальные сущности, а методы — это функции, привязанные к конкретным типам (классам, структурам или перечислениям) и имеющие доступ к их внутреннему состоянию. В Swift оба понятия широко используются, и понимание их различий критически важно для написания чистого, хорошо организованного кода.