Puedo ver estas definiciones en la biblioteca Swift:
extension Bool : BooleanLiteralConvertible {
static func convertFromBooleanLiteral(value: Bool) -> Bool
}
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}
¿Cuál es la diferencia entre una función miembro definida como static func
y otra definida como class func
? ¿Es simplemente static
para funciones estáticas de estructuras y enumeraciones, y class
para clases y protocolos? ¿Hay alguna otra diferencia que uno debería saber? ¿Cuál es la razón para tener esta distinción en la sintaxis misma?
class func
? Con la información que tenemos ahora, esta distinción parece bastante inútil, ¿no?class func
serror: class methods are only allowed within classes; use 'static' to declare a static method
Respuestas:
Esa es la principal diferencia. Algunas otras diferencias son que las funciones de clase se distribuyen dinámicamente y pueden ser anuladas por subclases.
Los protocolos usan la palabra clave class, pero no excluye las estructuras de implementar el protocolo, solo usan static en su lugar. Se eligió la clase para los protocolos, por lo que no tendría que haber una tercera palabra clave para representar estática o clase.
De Chris Lattner sobre este tema:
Y aquí hay un fragmento que muestra algunos de los comportamientos de anulación de las funciones de clase:
fuente
static func myFunc()
lugar declass func myFunc
, obtendrá el siguiente error l: no se puede anular el método estático . ¿Por qué? Porque es como si hubiera sido marcado confinal
. Para más información. Vea la siguiente respuesta de D a continuación. Tambiénx.dynamicType
ahora ha sido reemplazado portype(of:x)
Para ser más claro, hago un ejemplo aquí,
static func
es igual quefinal class func
Como es así
final
, no podemos anularlo en la subclase de la siguiente manera:fuente
class func
es diferente de lo normal,func
aunque ambos pueden ser anulados. Perofunc
es para una instancia / objeto yclass func
se puede acceder a través de la clase comoClassA.classFunc()
Hice algunos experimentos en el patio y obtuve algunas conclusiones.
TL; DR
Como puede ver, en el caso de
class
, el uso declass func
ostatic func
es solo una cuestión de hábito.Ejemplo de patio de recreo con explicación:
fuente
class
funciones versus enlace estático destatic
unas.class func
reemplazable?class func
es invaluable Hubiera votado esto de otra manera; Me encanta la investigación y el ejemplo!Fuente: El lenguaje de programación Swift - Propiedades de tipo variable
fuente
De acuerdo con el libro Swift 2.2 publicado por apple:
“Indicas los métodos de escritura escribiendo la
static
palabra clave antes de la palabra clave func del método. Las clases también pueden usar laclass
palabra clave para permitir que las subclases anulen la implementación de la superclase de ese método ".fuente
De Swift2.0, Apple dice:
"Siempre prefija los requisitos de propiedad de tipo con la palabra clave estática cuando los defina en un protocolo. Esta regla se aplica a pesar de que los requisitos de propiedad de tipo pueden tener como prefijo la clase o la palabra clave estática cuando se implementa por una clase:"
fuente
¡Este ejemplo aclarará todos los aspectos!
Salida:
fuente
Esto se llama métodos de tipo y se llama con sintaxis de puntos, como los métodos de instancia. Sin embargo, llama a los métodos de tipo en el tipo, no en una instancia de ese tipo. Así es como se llama a un método de tipo en una clase llamada SomeClass:
fuente
static
yclass
palabras clave.