Compare Protocolo em Swift vs Interface em Java

149

Estou passando pelo tutorial do iOS na página de desenvolvedor da Apple .

Parece-me que protocole interfacequase tem a mesma funcionalidade.

  • Existem diferenças entre os dois?

  • o uso diferente no projeto?

Atualizada

Sim , li o link acima e ainda não tenho certeza das diferenças e uso entre protocole interface. Quando faço uma pergunta como essa, gostaria de ver uma explicação simples sobre o tópico. Às vezes, pode ser difícil obter tudo da documentação.

Bun
fonte
1
Protocolos no Swift e Interfaces em Java são os mesmos conceitos. Veja aqui
Vivek Molkar
69
Penso que perguntas como esta sobre diferenças entre idiomas são realmente úteis para entender os recursos do idioma. E não acho que eles levem a respostas opinativas desnecessárias nem sejam muito fáceis de encontrar na documentação. Portanto, não acho que os votos negativos sobre esta questão sejam justificados.
Lii
1
Aqui estão alguns pontos críticos do mundo real sobre as interfaces Java - stackoverflow.com/a/41143492/294884 - que seriam essenciais para qualquer pessoa que esteja
iniciando
Por outro lado, é bom lembrar que toda a razão de ser do Swift é que é para "programação orientada a protocolo". Você faz tudo com "extensões de protocolo" no Swift onipresentemente. Por exemplo, aqui está um problema sutil sobre o Swift (ou seja: "sobre extensões de protocolo") que ilustra alguns dos problemas.
Gordo
2
Em Swift, em vez de interfaces, o nome do protocolo é utilizado porque em arquivos de cabeçalho C Objectivo (duplicações inúteis) de C são chamados as interfaces
Alex78191

Respostas:

117

Essencialmente, os protocolos são muito semelhantes às interfaces Java, exceto:

  • Os protocolos Swift também podem especificar propriedades que devem ser implementadas (ou seja, campos)
  • Protocolos rápidos precisam lidar com valor / referência através do uso da palavra-chave mutante (porque os protocolos podem ser implementados por estruturas e classes)
  • você pode combinar protocolos a qualquer momento com a palavra-chave protocol <>. Por exemplo, declarar um parâmetro de função que deve aderir aos protocolos A e B como:

.

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

Essas são as diferenças imediatamente aparentes para um desenvolvedor Java (ou pelo menos o que vi até agora).

Thomas Schar
fonte
13
" the protocol <> keyword ": Isso é muito legal! Eu acho que isso é chamado de tipo de interseção na comunidade da teoria dos sistemas de tipos. Em Java, você só pode ter esses tipos para parâmetros de tipo com vários limites. Este artigo sugere introduzi-los em Java como tipo de primeira classe, com sintaxe para denotá-los.
21715 Lii
7
Resumo legal. Algumas características mais importantes: Os protocolos Swift também podem especificar requisitos de tipo associado - por exemplo, um tipo de coleção tem um tipo de índice associado ou métodos de comparação de um tipo comparável exigem um parâmetro do mesmo tipo. E no Swift 2.0, as extensões de protocolo podem adicionar funcionalidade real a tipos que atendem aos requisitos de um protocolo.
Rickster
2
@rickster O Java 8 também pode adicionar implementação a uma interface, marcando um método com a default palavra - chave . Veja o Tutorial do Oracle .
Basil Bourque 21/03
5
A palavra-chave protocol <> foi removida em favor do e comercial. Então você pode escrever: let c: A & B
Paul Robinson
2
Em Swift, em vez de interfaces, o nome do protocolo é utilizado porque em arquivos de cabeçalho C Objectivo (duplicações inúteis) de C são chamados as interfaces
Alex78191
33

Complementando a resposta de @Thomas Schar. A mágica do protocolo Swift vem da extensão.

  • Os protocolos Swift podem obter implementações por meio da extensão (Swift
    2). A interface Java 8 pode ter implementações padrão, mas não pode ser feita "retroativamente".
  • No Swift, você pode "retroativamente" adicionar requisitos de protocolo (e
    suas implementações, se necessário) a qualquer classe ou estrutura.
  • Os protocolos Swift não seguem o padrão de personalização genérico (isto é, <..>), mas um esquema de tipealias (isto é, Tipos Associados). Pode ser confuso no início, mas pode evitar a
    "cegueira angular" em alguns casos.
  • O Swift possui uma correspondência de padrões de tipo avançada, permitindo ser muito específico sobre onde e como os requisitos e extensões de protocolo são aplicados. Pode ser confuso quando vem do Java, mas tem muito poder.
  • Um protocolo rápido pode ser composto por uma propriedade / parâmetro (isto é, celebrator: protocol)

Uma coisa que me fez coçar a cabeça por algumas horas é que nem todos os protocolos podem ser usados ​​como tipos de propriedade. Por exemplo, se você possui um protocolo com typealias, não pode usá-lo diretamente como um tipo de propriedade (faz sentido quando você pensa sobre isso, mas, vindo do Java, realmente queremos ter uma propriedade como userDao: IDao).

Jeremy Chone
fonte
7
Os protocolos Swift também podem ter membros opcionais, ao contrário das interfaces Java.
eyeApps LLC
4
Um ponto secundário que sempre aparece no Swift é que (ridiculamente) não há funções abstratas, então você simplesmente "imprime que esqueceu essa!" ... stackoverflow.com/a/24111430/294884
Fattie
@Fattie. Você pode usar a palavra-chave "required" em uma função para especificar que requer uma implementação de subclasse. Realmente, mais como uma pequena ignorância do que um argumento real.
Dirk Bester
@DirkBester - felicidades - espere, você está falando com inicializadores ??
Fattie 30/06
Novamente @DirkBester Eu posso ter alguma confusão, mas não se pode usar requiredantes de uma função em um protocolo, você apenas 'required' may only be used on 'init' declarations...
Fattie