Comparar protocolo en Swift versus interfaz en Java

149

Estoy revisando el tutorial de iOS de la página de desarrollador de Apple .

Me parece eso protocoly interfacecasi tiene la misma funcionalidad.

  • ¿Hay alguna diferencia entre los dos?

  • ¿El uso diferente en el proyecto?

Actualizado

, leí el enlace de arriba y todavía no estoy seguro de cuáles son las diferencias y el uso entre protocoly interface. Cuando hago una pregunta como esta, me gustaría ver una explicación simple sobre el tema. En algún momento puede ser difícil obtener todo de la documentación.

Bollo
fuente
1
Los protocolos en Swift y las interfaces en Java son los mismos conceptos. Ver aquí
Vivek Molkar
69
Creo que preguntas como esta sobre las diferencias entre idiomas son realmente útiles para comprender las características del lenguaje. Y no creo que conduzcan a respuestas innecesarias con opiniones ni que sea muy fácil encontrar la respuesta en la documentación. Así que no creo que los votos negativos sobre esta cuestión estén justificados.
Lii
1
Aquí hay un par de puntos críticos del mundo real sobre las interfaces de Java: stackoverflow.com/a/41143492/294884 , que serían clave para cualquier persona nueva con Swift que
pruebe
En la otra dirección, vale la pena recordar que toda la razón de ser de Swift es que es para "programación orientada al protocolo". Hace todo con "extensiones de protocolo" en Swift de manera ubicua. Por ejemplo, aquí hay un problema sutil sobre Swift (es decir, "sobre extensiones de protocolo") que ilustra algunos de los problemas.
Fattie
2
En Swift, en lugar de interfaces, se usa el nombre del protocolo porque en el objetivo C los archivos de encabezado (duplicados inútiles) de C se llaman interfaces
Alex78191

Respuestas:

117

Esencialmente, los protocolos son muy similares a las interfaces de Java, excepto por:

  • Los protocolos Swift también pueden especificar propiedades que deben implementarse (es decir, campos)
  • Los protocolos rápidos deben tratar con el valor / referencia mediante el uso de la palabra clave mutante (porque los protocolos pueden implementarse mediante estructuras y clases)
  • Puede combinar protocolos en cualquier momento con la palabra clave protocol <>. Por ejemplo, declarar un parámetro de función que debe cumplir con el protocolo A y B como:

.

func foo ( var1 : protocol<A, B> ){}

Estas son las diferencias inmediatamente aparentes para un desarrollador Java (o al menos lo que he visto hasta ahora).

Thomas Schar
fuente
13
" el protocolo <> palabra clave ": ¡Eso es realmente genial! Creo que esto es lo que se llama un tipo de intersección en la comunidad de teoría de sistemas de tipos. En Java solo puede tener tales tipos para parámetros de tipo con múltiples límites. Este artículo sugiere introducirlos en Java como tipo de primera clase, con sintaxis para denotarlos.
Lii
77
Buen resumen Un par de características más importantes: los protocolos Swift también pueden especificar requisitos de tipo asociados, por ejemplo, un tipo de colección tiene un tipo de índice asociado, o los métodos de comparación de un tipo comparable requieren un parámetro del mismo tipo. Y en Swift 2.0, las extensiones de protocolo pueden agregar funcionalidad real a los tipos que satisfacen los requisitos de un protocolo.
rickster
2
@rickster Java 8 también puede agregar implementación a una interfaz al etiquetar un método con la default palabra clave . Vea el Tutorial de Oracle .
Basil Bourque
55
La palabra clave del protocolo <> ahora se ha eliminado a favor del signo "&". Para que pueda escribir: let c: A & B
Paul Robinson
2
En Swift, en lugar de interfaces, se usa el nombre del protocolo porque en el objetivo C los archivos de encabezado (duplicados inútiles) de C se llaman interfaces
Alex78191
33

Complementando la respuesta de @Thomas Schar. La magia del protocolo Swift proviene de la extensión.

  • Los protocolos Swift pueden obtener implementaciones a través de la extensión (Swift
    2). La interfaz Java 8 puede tener implementaciones predeterminadas, pero no se puede hacer "retroactivamente".
  • En Swift, puede agregar "retroactivamente" requisitos de protocolo (y
    sus implementaciones si es necesario) a cualquier clase o estructura.
  • Los protocolos de Swift no siguen el patrón de personalización genérico (es decir, <..>), sino un esquema de typealias (es decir, Tipos asociados). Puede ser confuso al principio, pero puede evitar la
    "ceguera del soporte angular" en algunos casos.
  • Swift tiene una coincidencia de patrones de tipos avanzada, lo que permite ser muy específico sobre dónde y cómo se aplican los requisitos y extensiones de protocolo. Puede ser confuso cuando viene de Java, pero tiene mucho poder.
  • Se puede componer un protocolo rápido para una propiedad / parámetro (es decir, celebrador: protocolo)

Una cosa que me hizo rascarme la cabeza durante un par de horas es que no todos los protocolos se pueden usar como tipos de propiedad. Por ejemplo, si tiene un protocolo con typealias, no puede usarlo directamente como un tipo de propiedad (tiene sentido cuando lo piensa, pero viniendo de Java realmente queremos tener una propiedad como userDao: IDao).

Jeremy Chone
fuente
77
Además, los protocolos Swift pueden tener miembros opcionales, a diferencia de las interfaces Java.
eyeApps LLC
44
Un punto menor que siempre aparece en Swift es que no hay (ridículamente) funciones abstractas, así que solo tienes que "imprimir, olvidaste esta". ... stackoverflow.com/a/24111430/294884
Fattie
@Fattie. Puede usar la palabra clave "requerida" en una función para especificar que requiere una implementación de subclase. Entonces, realmente, más como una ignorancia menor que un punto real.
Dirk Bester
@DirkBester - salud - espera, ¿estás hablando con inicializadores?
Fattie
De nuevo @DirkBester Puedo tener algo de confusión, pero uno no puede usar requiredantes de una función en un protocolo, solo obtienes 'required' may only be used on 'init' declarations...
Fattie