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 funcy otra definida como class func? ¿Es simplemente staticpara funciones estáticas de estructuras y enumeraciones, y classpara 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 funcserror: class methods are only allowed within classes; use 'static' to declare a static methodRespuestas:
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.dynamicTypeahora ha sido reemplazado portype(of:x)Para ser más claro, hago un ejemplo aquí,
static funces igual quefinal class funcComo es así
final, no podemos anularlo en la subclase de la siguiente manera:fuente
class funces diferente de lo normal,funcaunque ambos pueden ser anulados. Perofunces para una instancia / objeto yclass funcse 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 funcostatic funces solo una cuestión de hábito.Ejemplo de patio de recreo con explicación:
fuente
classfunciones versus enlace estático destaticunas.class funcreemplazable?class funces 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
staticpalabra clave antes de la palabra clave func del método. Las clases también pueden usar laclasspalabra 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
staticyclasspalabras clave.