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 trato de definir otra variable class var myVar2 = ""
, dice:
Propiedades almacenadas de clase que aún no se admiten en clases; ¿quiso decir 'estático'?
Cuando se admite esta característica, ¿cuál será la diferencia entre una variable estática y una variable de clase (es decir, cuando ambas se definen en una clase)? ¿Cuál debo usar y cuándo?
(Xcode 6.3)
Respuestas:
static
yclass
ambos asocian un método con una clase, en lugar de una instancia de una clase. La diferencia es que las subclases pueden anular losclass
métodos; No pueden anular losstatic
métodos.class
Las propiedades funcionarán teóricamente de la misma manera (las subclases pueden anularlas), pero aún no son posibles en Swift.fuente
final class
función y función 'estática' dentro de una clase?final
se puede usar para cortar anulaciones adicionales cuando se usa en una subclase. Los dos tienen su lugar, diría que el uso destatic
ofinal
cuando se usa en una función de clase es trivial y depende de su elección de estilo.static func foo(){}
en Swift es comopublic static final foo(){}
en Java?Intenté la respuesta y los comentarios de mipadi en el patio de recreo. Y pensé en compartirlo. Aqui tienes. Creo que la respuesta de mipadi debería marcarse como aceptada.
fuente
En cuanto a OOP , 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 su publicación, si desea declarar una variable de clase (como lo hizo
class var myVar2 = ""
), debe hacerlo de la siguiente manera:fuente
También tuve esta confusión en uno de mis proyectos y encontré esta publicación muy útil. Intenté lo mismo en mi patio de recreo y aquí está el resumen. Espero que esto ayude a alguien con propiedades y funciones de tipo almacenados
static
,final
,class
, clase anulando vars etc.Y aquí están las muestras de prueba:
fuente
Las pruebas en Swift 4 muestran la diferencia de rendimiento en el simulador. Hice una clase con "class func" y struct con "static func" y los ejecuté en la prueba.
la función estática es:
Sin embargo, ejecutar el mismo código en iPhone 7 con iOS 10.3 muestra exactamente el mismo rendimiento.
Aquí hay un proyecto de muestra en Swift 4 para Xcode 9 si desea probarse a sí mismo https://github.com/protyagov/StructVsClassPerformance
fuente
Hay una diferencia más.
class
se puede usar para definir propiedades de tipo de tipo calculado solamente . Si necesita una propiedad de tipo almacenado, usestatic
en su lugar."Usted define las propiedades de tipo con la palabra clave estática. Para las propiedades de tipo calculadas para los tipos de clase, puede usar la palabra clave de clase en su lugar para permitir que las subclases anulen la implementación de la superclase".
fuente
Agregando a las respuestas anteriores, los métodos estáticos son envío estático significa que el compilador sabe qué método se ejecutará en tiempo de ejecución ya que el método estático no se puede anular mientras que el método de clase puede ser un envío dinámico, ya que la subclase puede anularlos.
fuente
Hay una diferencia más. La clase se puede utilizar para definir propiedades de tipo de tipo calculado solamente. Si necesita una propiedad de tipo almacenado, use static en su lugar.
Clase: - tipo de referencia
struct: - tipo de valor
fuente
class
se usa dentroReference Type
(clase):static
se usa dentroReference Type
yValue Type
(clase, enumeración):[Referencia vs tipo de valor]
fuente