ios - multiple - swift protocol extension
Swift Declare Class Func en Protocolo (3)
Para hacer el método de protocolo estático y finalmente implementar ese método con una palabra clave estática
class ClassA: MyProtocol{
static func dummyClassMethod() {
}
}
y ahora ya no puede anular la función dummyClassMethod. Si desea evitar la anulación solo debe declarar el método de protocolo como final. En cuanto a las funciones de clase, no estaban totalmente soportadas en Swift 1.0 y ahora en Swift 1.2, creo que se están moviendo hacia funciones estáticas
Tuve después la confusión. Por lo que sé, la principal diferencia entre las palabras clave estáticas y de clase al declarar método es que la segunda podría ser anulada en subclases.
El problema
Sin embargo, cuando declaro un protocolo en Swift 1.2 como este:
protocol MyProtocol
{
class func dummyClassMethod()
}
el compilador da un error:
Los métodos de clase solo están permitidos dentro de las clases; usa ''static'' para declarar un método estático
El error es bastante descriptivo ya que, obviamente, MyProtocol no es una clase, sin embargo, quiero que una función de clase sea parte del protocolo.
Lo que he intentado
Descubrí que si declaro la interfaz en el protocolo como estático , el compilador está contento y podría usar este método estático en todas las clases que adopten este protocolo:
protocol MyProtocol
{
static func dummyClassMethod()
}
La pregunta
Así que mi pregunta básicamente es si esto es correcto? Esta declaración indica que mi método de clase no se puede anular en niños, sin embargo, en mi implementación podría escribir y usar lo siguiente:
class ClassA: MyProtocol
{
class func dummyClassMethod() {
}
}
class ClassB: ClassA
{
override class func dummyClassMethod() {
}
}
y ahora mi dummyClassMethod ya no es estático ...
El compilador está bien y todo funciona, pero ¿por qué?
¿Es específico al hecho de que la interfaz en sí es estática, pero su implementación no lo es?
- ¿Hay una mejor alternativa para la función de clase en los protocolos?
Solución objetiva-c
En ObjC esto es bastante fácil y compila y ejecuta perfectamente:
@protocol MyProtocol
+(void)dummyClassMethod;
@end
Puede revisar la documentación de Apple (subsección Requisitos del método ).
Allí dice:
Al igual que con los requisitos de propiedad de tipo, siempre debe prefijar los requisitos de método de tipo con la palabra clave estática cuando se definen en un protocolo. Esto es cierto aunque los requisitos de método de tipo tienen el prefijo de la clase o palabra clave estática cuando se implementa por una clase
En la práctica, puedes hacerlo de la siguiente manera:
Primero, declara tu protocolo:
protocol SomeProtocol {
static func someMethod()
}
Luego, en tu class
tienes 2 opciones :
Primero:
class SomeClass : SomeProtocol {
class func someMethod()
}
Segundo:
class SomeClass : SomeProtocol {
static func someMethod()
}
Espero que esto pueda aclarar vuestras dudas.
Un protocolo define un plano de métodos, propiedades y otros requisitos que se adaptan a una tarea particular o pieza de funcionalidad. El protocolo en realidad no proporciona una implementación para ninguno de estos requisitos, solo describe cómo se verá una implementación. El protocolo puede ser adoptado por una clase, estructura o enumeración para proporcionar una implementación real de esos requisitos.
Después de esta definición de protocolo se hace razonable que
Al igual que con los requisitos de propiedad de tipo, siempre debe prefijar los requisitos de método de tipo con la palabra clave estática cuando se definen en un protocolo. Esto es cierto aunque los requisitos de método de tipo tienen el prefijo de la clase o palabra clave estática cuando se implementa por una clase ...