2015-06-16 15 views
82

Sto passando attraverso il tutorial iOS da Apple developer page.Confronto del protocollo in Swift vs Interface in Java

Mi sembra che lo standard e interface abbiano quasi la stessa funzionalità.

  • Ci sono differenze tra i due?

  • l'utilizzo della differenza nel progetto?

Aggiornato

, ho letto il link qui sopra e io non sono ancora sicuro di quali siano le differenze e l'utilizzo tra e interface. Quando faccio una domanda del genere, mi piacerebbe vedere una semplice spiegazione sull'argomento. A volte potrebbe essere difficile ottenere tutto dalla documentazione.

+1

I protocolli in Swift e le interfacce in Java sono gli stessi concetti. Vedi [qui] (https://en.wikipedia.org/wiki/Protocol_ (object-oriented_programming)) –

+32

Penso che domande come questa sulle differenze tra le lingue siano davvero utili per comprendere le caratteristiche del linguaggio. E non credo che portino a risposte non necessarie e supponenti, né è facile trovare la risposta nella documentazione. Quindi non penso che i voti negativi su questa domanda siano giustificati. – Lii

+0

Ecco un paio di ** punti critici del mondo reale ** sulle interfacce Java - http://stackoverflow.com/a/41143492/294884 - che sarebbe la chiave per chiunque ** fresco con Swift, cercando Java ** – Fattie

risposta

57

Essenzialmente protocolli sono molto simili alle interfacce Java eccetto:

  • protocolli Swift possono anche specificare le proprietà che devono essere implementati (ossia il campo)
  • protocolli Swift devono affrontare valore/riferimento attraverso l'uso della mutazione della parola chiave (poiché i protocolli possono essere implementati da strutture e classi)
  • è possibile combinare i protocolli in qualsiasi punto con il protocollo <> parola chiave. Ad esempio, dichiarando un parametro di funzione che deve rispettare i protocolli A e B come:

.

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

Queste sono le differenze immediatamente apparenti per uno sviluppatore Java (o almeno quello che ho individuato finora).

+5

"_the protocol <> keyword_": È davvero fantastico! Penso che questo sia ciò che viene chiamato un tipo _intersection_ nella comunità della teoria dei sistemi di tipi. I Java è possibile avere solo tipi di questo tipo per i parametri di tipo con più limiti. [Questo documento] (http://www.cs.rice.edu/~javaplt/papers/oopsla2008.pdf) suggerisce di introdurli in Java come tipo di prima classe, con la sintassi per denotarli. – Lii

+5

Bel riassunto. Un paio di funzioni più importanti: i protocolli Swift possono anche specificare i requisiti di tipo associati, ad es. un tipo di raccolta ha un tipo di indice associato, oppure i metodi di confronto di un tipo comparabile richiedono un parametro dello stesso tipo. E in Swift 2.0, le estensioni di protocollo possono aggiungere funzionalità reali a tipi che soddisfano i requisiti di un protocollo. – rickster

+0

@rickster Anche Java 8 può aggiungere implementazione a un'interfaccia taggando un metodo con la parola chiave 'default' [https://en.wikipedia.org/wiki/List_of_Java_keywords]. Vedi il [Oracle Tutorial] (http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html). –

20

Complementare alla risposta di @Thomas Schar. La magia del protocollo Swift viene dall'estensione.

  • protocolli Swift possono ottenere implementazioni tramite estensione (Swift
    2). L'interfaccia Java 8 può avere implementazioni predefinite, ma non può essere eseguita "retroattivamente".
  • In modo rapido è possibile aggiungere "retroattivamente" i requisiti del protocollo (e
    sue implementazioni, se necessario) a qualsiasi classe o struttura.
  • I protocolli Swift non seguono il modello di personalizzazione generico (cioè < ..>), ma uno schema tipealias (cioè Tipi associati). Può essere fonte di confusione all'inizio, ma in alcuni casi può evitare
    "cecità della parentesi angolare".
  • Swift ha una corrispondenza di tipo di modello avanzata, che consente di essere molto specifico su dove e come vengono applicati i requisiti e le estensioni del protocollo . Può essere fonte di confusione quando proviene da Java, ma ha molto potere.
  • Il protocollo Swift può essere composto per una proprietà/parametro (ad es.celebrator: protocollo)

Una cosa che mi ha fatto graffiare la mia testa per un paio d'ore è che non tutti i protocolli possono essere usati come tipo di proprietà. Ad esempio, se si ha un protocollo con typealias, non è possibile utilizzarlo direttamente come un tipo di proprietà (ha senso quando ci si pensa, ma provenendo da Java vogliamo veramente avere una proprietà come userDao: IDao).

+4

Anche i protocolli Swift possono avere membri opzionali, a differenza delle interfacce Java. –

+1

Un punto minore che si presenta sempre in Swift è, non c'è (ridicolmente) nessuna funzione astratta, quindi basta andare "stampa hai dimenticato questo!" ... http://stackoverflow.com/a/24111430/294884 – Fattie

Problemi correlati