En los lenguajes de programación de la familia C (incluido Objective-C) siempre han existido "métodos de clase" (class methods). En Swift han aparecido dos tipos de métodos para tipos: static y class. Permiten invocar métodos en el propio tipo, y no en una instancia. Static se utiliza para estructuras, enumeraciones y clases sin posibilidad de sobreescritura, class — para clases con posibilidad de sobrescritura en los descendientes.
Problema: La confusión entre static y class surge en la jerarquía de clases, donde puede haber herencia y se quiere permitir o prohibir la sobrescritura de métodos/propiedades para los descendientes.
Solución:
Ejemplo de código:
class Animal { class func makeSound() { print("Some generic animal sound") } static func kingdom() -> String { "Animalia" } } class Dog: Animal { override class func makeSound() { print("Woof!") } // override static func kingdom() — error: ¡static no puede ser sobrescrito! } Animal.makeSound() // Some generic animal sound Dog.makeSound() // Woof! print(Animal.kingdom()) // Animalia
Características clave:
¿Se puede usar class func en struct o enum?
No, class func está permitido solo para clases. Struct y enum solo soportan métodos y propiedades estáticas.
¿Puede una propiedad estática ser calculada y/o mutable (var)?
Sí, una propiedad estática puede ser tanto calculada (computed) como almacenada (stored), y definirse a través de static var. Para struct y enum, esta es la única manera de hacer que una propiedad sea accesible a través del propio tipo, y no de una instancia.
Ejemplo de código:
struct Counter { static var totalCount = 0 static var nextId: Int { totalCount += 1 return totalCount } }
¿Se puede llamar a un método de clase a través de una instancia de clase?
Sí, pero no se recomienda: el método de clase siempre se refiere al tipo y no a un objeto específico, por lo que se invocará el comportamiento del tipo original o la sobrescritura, y no tiene relación con un objeto específico.
Uso de class func para utilidades estáticas de clase, aunque no se prevé sobrescrituras.
Ventajas:
Desventajas:
Uso de static para constantes y utilidades, class — para métodos de fábrica que realmente pueden ser cambiados en los descendientes.
Ventajas:
Desventajas: