¿Funciones/variables estáticas frente a clases en clases Swift?

Resuelto Senseful asked hace 9 años • 8 respuestas

El siguiente código se compila en Swift 1.2:

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

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

¿ Cuál es la diferencia entre una función estática y una función de clase ? ¿Cuál debo usar y cuándo?

Si intento definir otra variable class var myVar2 = "", dice:

Las propiedades almacenadas en la clase aún no son compatibles con las clases; ¿Quiso decir "estático"?

Cuando se admita esta característica, ¿cuál será la diferencia entre una variable estática y una variable de clase (es decir, cuando ambas están definidas en una clase)? ¿Cuál debo usar y cuándo?

(Xcódigo 6.3)

Senseful avatar Apr 15 '15 03:04 Senseful
Aceptado

staticy classambos asocian un método con una clase, en lugar de una instancia de una clase. La diferencia es que las subclases pueden anular classlos métodos; no pueden anular staticlos métodos.

classLas propiedades funcionan de la misma manera (las subclases pueden anularlas).

mipadi avatar Apr 14 '2015 20:04 mipadi

Probé la respuesta y los comentarios de mipadi en el patio de recreo. Y pensé en compartirlo. Aquí tienes. Creo que la respuesta de mipadi debería marcarse como aceptada.

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(){
        
    }
    
    //Let's 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(){
        
    }
}
MadNik avatar Oct 13 '2015 09:10 MadNik

En cuanto a la programación orientada a objetos , la respuesta es demasiado simple:

Las subclases pueden anular los métodos de clase , pero no pueden anular los métodos estáticos .

Además de tu publicación, si quieres declarar una variable de clase (como lo hiciste class var myVar2 = ""), debes hacerlo de la siguiente manera:

class var myVar2: String {
    return "whatever you want"
}
eMdOS avatar Jun 26 '2015 23:06 eMdOS