Comparez le protocole dans Swift et l'interface dans Java

149

Je suis en train de parcourir le didacticiel iOS de la page des développeurs Apple .

Il me semble que protocolet interfaceavoir presque la même fonctionnalité.

  • Y a-t-il des différences entre les deux?

  • l'utilisation différente dans le projet?

Actualisé

Oui , j'ai lu le lien ci-dessus et je ne suis toujours pas sûr des différences et de l'utilisation entre protocolet interface. Lorsque je pose une question comme celle-ci, j'aimerais voir une explication simple sur le sujet. Parfois, il peut être difficile d'obtenir tout dans la documentation.

Chignon
la source
1
Les protocoles dans Swift et les interfaces en Java sont les mêmes concepts. Voir ici
Vivek Molkar
69
Je pense que des questions comme celle-ci sur les différences entre les langues sont vraiment utiles pour comprendre les fonctionnalités de la langue. Et je ne pense pas qu'ils conduisent à des réponses inutiles, ni très faciles à trouver dans la documentation. Je ne pense donc pas que les votes négatifs sur cette question soient justifiés.
Lii
1
Voici quelques points critiques du monde réel sur les interfaces Java - stackoverflow.com/a/41143492/294884 - ce serait la clé pour quiconque est novice avec Swift, essayant Java
Fattie
Dans l'autre sens, il ne faut pas oublier que toute la raison d'être de Swift est qu'il s'agit de "programmation orientée protocole". Vous faites tout avec des "extensions de protocole" dans Swift de manière omniprésente. Par exemple, voici un problème subtil à propos de Swift (c'est-à-dire: «à propos des extensions de protocole») qui illustre certains des problèmes.
Fattie
2
Dans Swift, au lieu des interfaces, le nom du protocole est utilisé car en Objective C, les fichiers d'en-tête (doublons inutiles) de C sont appelés interfaces
Alex78191

Réponses:

117

Essentiellement, les protocoles sont très similaires aux interfaces Java, sauf pour:

  • Les protocoles Swift peuvent également spécifier les propriétés qui doivent être implémentées (c.-à-d. Des champs)
  • Les protocoles Swift doivent gérer la valeur / la référence via l'utilisation du mot-clé mutating (car les protocoles peuvent être implémentés par des structures et des classes)
  • vous pouvez combiner des protocoles à tout moment avec le mot-clé protocol <>. Par exemple, déclarer un paramètre de fonction qui doit adhérer aux protocoles A et B comme:

.

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

Ce sont les différences immédiatement apparentes pour un développeur Java (ou du moins ce que j'ai repéré jusqu'à présent).

Thomas Schar
la source
13
" the protocol <> keyword ": C'est vraiment cool! Je pense que c'est ce qu'on appelle un type d'intersection dans la communauté de la théorie des systèmes de types. En Java, vous ne pouvez avoir de tels types que pour les paramètres de type avec plusieurs limites. Cet article suggère de les introduire en Java en tant que type de première classe, avec une syntaxe pour les désigner.
Lii
7
Bon résumé. Quelques caractéristiques plus importantes: les protocoles Swift peuvent également spécifier des exigences de type associées - par exemple, un type de collection a un type d'index associé, ou les méthodes de comparaison d'un type comparable nécessitent un paramètre du même type. Et dans Swift 2.0, les extensions de protocole peuvent ajouter des fonctionnalités réelles aux types qui satisfont aux exigences d'un protocole.
rickster
2
@rickster Java 8 peut également ajouter une implémentation à une interface en étiquetant une méthode avec le default mot - clé . Consultez le didacticiel Oracle .
Basil Bourque
5
Le mot-clé protocol <> a maintenant été supprimé au profit de l'esperluette. Vous pouvez donc écrire: let c: A & B
Paul Robinson
2
Dans Swift, au lieu des interfaces, le nom du protocole est utilisé car en Objective C, les fichiers d'en-tête (doublons inutiles) de C sont appelés interfaces
Alex78191
33

En complément de la réponse de @Thomas Schar. La magie du protocole Swift vient de l'extension.

  • Les protocoles Swift peuvent obtenir des implémentations via l'extension (Swift
    2). L'interface Java 8 peut avoir des implémentations par défaut, mais cela ne peut pas être fait «rétroactivement».
  • Dans Swift, vous pouvez ajouter "rétroactivement" des exigences de protocole (et
    ses implémentations si nécessaire) à n'importe quelle classe ou structure.
  • Les protocoles Swift ne suivent pas le modèle de personnalisation générique (c'est-à-dire <..>), mais un schéma de typealias (c'est-à-dire les types associés). Peut être déroutant au début, mais peut éviter la
    "cécité de la cornière" dans certains cas.
  • Swift a une correspondance de modèle de type avancée, permettant d'être très spécifique sur où et comment les exigences et les extensions de protocole sont appliquées. Cela peut être déroutant en venant de Java, mais il a beaucoup de puissance.
  • Un protocole rapide peut être composé pour une propriété / paramètre (ie célébrateur: protocole)

Une chose qui m'a fait me gratter la tête pendant quelques heures est que tous les protocoles ne peuvent pas être utilisés comme types de propriétés. Par exemple, si vous avez un protocole avec des typealias, vous ne pouvez pas l'utiliser directement comme type de propriété (cela a du sens quand on y pense, mais venant de Java, nous voulons vraiment avoir une propriété comme userDao: IDao).

Jeremy Chone
la source
7
Les protocoles Swift peuvent également avoir des membres facultatifs, contrairement aux interfaces Java.
eyeApps LLC
4
Un point mineur qui revient toujours dans Swift est qu'il n'y a (ridiculement) aucune fonction abstraite, donc vous allez simplement "imprimer vous avez oublié celle-ci!" ... stackoverflow.com/a/24111430/294884
Fattie
@Fattie. Vous pouvez utiliser le mot-clé "required" sur une fonction pour spécifier qu'elle nécessite une implémentation de sous-classe. Donc vraiment, plus comme une ignorance mineure qu'un point réel.
Dirk Bester
@DirkBester - bravo - attendez, vous parlez avec des initialiseurs ??
Fattie
Encore une fois @DirkBester, je peux avoir une certaine confusion mais on ne peut pas utiliser requiredavant une fonction dans un protocole, vous obtenez juste 'required' may only be used on 'init' declarations...
Fattie