¿Por qué Apple enfatiza el desarrollo orientado al protocolo en Swift? Java ha soportado la interfaz durante mucho tiempo, ¿qué tiene de especial el protocolo de uso?

Los protocolos son mucho más potentes que las interfaces en Java, a pesar de que son el mismo concepto. De hecho, las interfaces Java se inspiraron originalmente en los protocolos Objective-C, que nuevamente los obtuvieron de Smalltalk.

En swift puede hacer que una clase existente implemente un protocolo que haya definido. Por ejemplo, podría crear un protocolo Car y hacer que la cadena en la biblioteca estándar rápida implemente este protocolo. Entonces, cada Cadena, sin importar cómo se produjera, sería un objeto Car, así como una cadena.

Otra característica poderosa de los protocolos Swift es que puede proporcionar implementaciones predeterminadas de métodos. A este respecto, un protocolo rápido es un poco como una clase abstracta de Java. Excepto que puede especificar las condiciones bajo las cuales la clase implementadora obtendrá la implementación del método predeterminado. Y una clase Java concreta solo puede recibir implementaciones de métodos de 1 clase abstracta, mientras que una clase Swift puede obtener implementaciones de métodos predeterminadas de cualquier número de protocolos.

Los protocolos Swift también pueden definir cosas como métodos opcionales, lo cual es muy útil para cosas como devoluciones de llamada. En Java, generalmente se resuelve esto heredando una interfaz y proporcionando implementaciones ficticias para evitar obligar al usuario de una interfaz de escucha a tener que implementar todo lo que contiene.

Llamar a un método opcional se realiza de manera similar a hacer una llamada a un método en un tipo opcional en Swift, por lo que no hay peligro de llamar a un método que no se ha implementado.

Un factor limitante en las interfaces Go, que no sé si es el caso en Java, es que los argumentos de un método deben ser tipos o interfaces específicos, mientras que en Swift puede especificar un tipo como Self, que luego se convierte en un marcador de posición para cualquier clase concreta implementa esta interfaz.

A diferencia de Java y Go, incluso los tipos primitivos, como int y float, pueden adoptar protocolos.