¿Funciones/variables estáticas frente a clases en clases Swift?
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)
static
y class
ambos asocian un método con una clase, en lugar de una instancia de una clase. La diferencia es que las subclases pueden anular class
los métodos; no pueden anular static
los métodos.
class
Las propiedades funcionan de la misma manera (las subclases pueden anularlas).
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(){
}
}
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"
}