Как стать автором
Обновить

Чем отличаются статические функции/переменные от функций/переменных на классе?

При обсуждении языка 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() {}
}
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.