function - type - swift is




Funções/variáveis estáticas versus classes nas classes Swift? (5)

O código a seguir é compilado no Swift 1.2:

class myClass {
    static func myMethod1() {
    }
    class func myMethod2() {
    }
    static var myVar1 = ""
}

func doSomething() {
    myClass.myMethod1()
    myClass.myMethod2()
    myClass.myVar1 = "abc"
}

Qual é a diferença entre uma função estática e uma função de classe ? Qual devo usar e quando?

Se eu tentar definir outra class var myVar2 = "" variável class var myVar2 = "" , ele diz:

Propriedades armazenadas de classe ainda não suportadas em classes; você quis dizer 'estático'?

Quando esse recurso é suportado, qual será a diferença entre uma variável estática e uma variável de classe (ou seja, quando ambas são definidas em uma classe)? Qual devo usar e quando?

(Xcode 6.3)


Adicionar as respostas acima aos métodos estáticos é despacho estático significa que o compilador sabe qual método será executado em tempo de execução, pois o método estático não pode ser substituído, enquanto o método da classe pode ser um despacho dinâmico, pois a subclasse pode substituí-los.


Em relação ao POO , a resposta é muito simples:

As subclasses podem substituir métodos de classe , mas não podem substituir métodos estáticos .

Além da sua postagem, se você quiser declarar uma variável de classe (como fez na class var myVar2 = "" ), faça o seguinte:

class var myVar2: String {
    return "whatever you want"
}

Eu tentei a resposta de mipadi e comentários no playground. E pensou em compartilhá-lo. Aqui está. Acho que a resposta de mipadi deve ser considerada aceita.

class A{
    class func classFunction(){
    }
    static func staticFunction(){
    }
    class func classFunctionToBeMakeFinalInImmediateSubclass(){
    }
}

class B: A {
    override class func classFunction(){

    }

    //Compile Error. Class method overrides a 'final' class method
    override static func staticFunction(){

    }

    //Lets avoid the function called 'classFunctionToBeMakeFinalInImmediateSubclass' being overriden by subclasses

    /* First way of doing it
    override static func classFunctionToBeMakeFinalInImmediateSubclass(){
    }
    */

    // Second way of doing the same
    override final class func classFunctionToBeMakeFinalInImmediateSubclass(){
    }

    //To use static or final class is choice of style.
    //As mipadi suggests I would use. static at super class. and final class to cut off further overrides by a subclass
}

class C: B{
    //Compile Error. Class method overrides a 'final' class method
    override static func classFunctionToBeMakeFinalInImmediateSubclass(){

    }
}


static e class associam um método a uma classe, em vez de uma instância de uma classe. A diferença é que as subclasses podem substituir class métodos de class ; eles não podem substituir métodos static .

teoricamente, as propriedades de class funcionarão da mesma maneira (as subclasses podem substituí-las), mas elas ainda não são possíveis no Swift.







static