protocol multiple extension delegate ios swift protocols static-methods class-method

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 ...

  1. El compilador está bien y todo funciona, pero ¿por qué?

  2. ¿Es específico al hecho de que la interfaz en sí es estática, pero su implementación no lo es?

  3. ¿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.


https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

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 ...