Чем отличаются статические функции/переменные от функций/переменных на классе?
При обсуждении языка Swift многие оперируют такими словами как методы экземпляра, функции или переменные на классе, статические методы и как с этим связаны вычисляемые переменные, наша команда постаралась объяснить что это такое и в чем ключевые различия этих слов.
Методы экземпляра — это функции, которые принадлежат экземплярам определенного класса, структуры или перечисления. Они поддерживают функциональность этих экземпляров, либо предоставляя способы доступа и изменения свойств экземпляра, либо предоставляя функции, связанные с назначением экземпляра. По сути классический функции записанные внутри экземпляра перечисленных выше типов.
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
Методы экземпляра, как описано выше, — это методы, которые вы вызываете для экземпляра определенного типа. Вы также можете определить методы, вызываемые для самого типа. Такие методы называются методами типов. Вы указываете методы типа, записывая ключевое слово static перед ключевым словом func метода. Классы могут использовать ключевое слово class, чтобы подклассы могли переопределить реализацию этого метода суперклассом. Методы типа вызываются с точечным синтаксисом, как и методы экземпляра.
Однако вы вызываете методы типа для типа, а не для экземпляра этого типа.
class SomeClass {
class func someTypeMethod() {
print("someTypeMethod")
}
}
SomeClass.someTypeMethod()
Главное отличие static методов от class — это возможность переопределения в классах наследников. Также есть возможность сделать свойства static или class, но есть нюанс — static свойство может быть stored property или computed property. Class свойство же может быть только computed property.
protocol MyProtocol {
// class var protocolClassVariable : Int { get }//Ошибка:
Class свойство может быть только на классе
static var protocolStaticVariable : Int { get }
// class func protocolClassFunc()//Ошибка:
Class метод может быть только на классе
static func protocolStaticFunc()
}
struct ValueTypeStruct: MyProtocol {
//Начало следования протокола
static var protocolStaticVariable: Int = 1
static func protocolStaticFunc() {
}
//Конец следования протокола
// class var classVariable = "classVariable"//Ошибка:
Class свойство может быть только на классе
static var staticVariable = "staticVariable"
// class func classFunc() {} //Ошибка:
Class метод может быть только на классе
static func staticFunc() {}
}
class ReferenceTypeClass: MyProtocol {
//Начало следования протокола
static var protocolStaticVariable: Int = 2
static func protocolStaticFunc() {
}
//Конец следования протокола
var variable = "variable"
// class var classStoredPropertyVariable = "classVariable"//Ошибка:
Class свойство не может быть stored property
class var classComputedPropertyVariable: Int {
get {
return 1
}
}
static var staticStoredPropertyVariable = "staticVariable"
static var staticComputedPropertyVariable: Int {
get {
return 1
}
}
class func classFunc() {}
static func staticFunc() {}
}
final class FinalSubReferenceTypeClass: ReferenceTypeClass {
override class var classComputedPropertyVariable: Int {
get {
return 2
}
}
override class func classFunc() {}
}