Quando a Apple anunciou o lançamento de Swift, a primeira linguagem orientada a protocolo, em sua Worldwide Developers Conference (WWDC) em 2015, isso indicou um afastamento de sua programação orientada a objeto existente, Objective-C.
Mas como Objective-C utiliza herança de compartilhamento implícita, a criação de novos objetos se torna um processo lento e os novos objetos geralmente têm funcionalidades desnecessárias. Nesse caso, se uma hierarquia de classes for complexa, mantê-la pode causar problemas como ineficiência e condições de corrida.
Com o paradigma de protocolo do Swift, os desenvolvedores agora podem construir objetos sem herança, os objetos podem ser usados pelo código existente e uma única classe pode trabalhar com vários protocolos sem a necessidade de herança.
Nesta postagem, discutiremos o paradigma de protocolo do Swift e suas vantagens. Conhecimento de programação orientada a objetos é útil para entender o conteúdo desta postagem.
O que são protocolos e como funcionam no Swift?
Geralmente, um protocolo:
- É um projeto que uma classe ou estrutura segue
- É um contrato de comunicação para objetos não relacionados nos quais confiar
- Define métodos e valores
Para entender como os protocolos funcionam no Swift, vamos supor que estejamos construindo um software aplicativo e devemos modelar os requisitos para satisfazer o aplicativo. Podemos começar com uma superclasse e moldar o relacionamento por meio de herança ou começar com um protocolo e moldar o relacionamento por meio da implementação.
Se quisermos construir um sistema de remessa de salários para nosso aplicativo e tivermos uma classe Funcionário
, usar um protocolo parecido com o seguinte:
protocol EmployeeProtocol { var emplname: String {get} descrição da var: String {get} var salary: Int {get set} func paySalary (salary: Int)-> String }
Normalmente, se usarmos get
, podemos torná-lo um const
, var
, let
ou propriedade computada. No entanto, usando a declaração de propriedade get set
para os limites de propriedade salary
var salary: Int {get set}
para var
.
Se quisermos escrever uma classe que siga este protocolo, como a classe Employee
, temos o seguinte:
class Employee: EmployeeProtocol { var emplname: String="Victor Jonah" var description: String="Software Engineer" salário var: Int=5000 func paySalary (salary: Int)-> String { return"Salário desembolsado para {emplname}" } }
Em resumo, os protocolos nos permitem agrupar nossos métodos, propriedades e funções. No entanto, esses protocolos só podem estar em conformidade com classes, enums e structs.
Mais de um protocolo pode estar em conformidade com um objeto, mas devem ser separados por vírgulas:
struct Player: MainPlayer, EnemyPlayer { //definição de código }
Além disso, se uma classe tem uma superclasse, podemos definir quaisquer protocolos após o nome da superclasse:
class TheClass: ItsSuperclass, FirstProtocol, SecondProtocol { //a definição da classe vai aqui }
Podemos usar enum
com nossos protocolos para propriedades computadas, mas eles não funcionam para propriedades armazenadas:
enum Employer: EmployerProtocol { var name: String { retornar"Alex" } var description: String { retornar"CEO" } var salary: Int { obter { Retorna } } }
O Swift também gera um erro no tempo de compilação se o protocolo não estiver em conformidade com a classe, estrutura ou enum.
Um exemplo de protocolo móvel Swift
Vejamos um caso de uso mais comum para o protocolo com um exemplo móvel:
protocol Mobile { var name: String {get} var iEMICode: Int {get} var sIMCard: String {get} processador var: String {get} var internalMemory: Int {get} var isSingleSIM: Bool {get} função mutante GetIEMICode ()-> String função SendMessage ()-> String função Dial ()-> String função Receive ()-> String init (nome: String) } struct Apple: Mobile { var name: String="Apple" init (nome: String) { self.name=name } var iEMICode: Int=3244332 var sIMCard: String="Vodaphone" processador var: String="Snapdragon" var internalMemory: Int=213424 var isSingleSIM: Bool=true função mutante GetIEMICode ()-> String { retornar"IEMEICode" } função SendMessage ()-> String { retornar"Mensagem enviada" } func Dial ()-> String { retornar"discado" } função Receive ()-> String { retornar"Recebendo chamada" } } struct Samsung: Mobile { var name: String="Samsung" init (nome: String) { self.name=name } var iEMICode: Int=3243433 var sIMCard: String="TMobile" processador var: String="Snapdragon" var internalMemory: Int=324432 var isSingleSIM: Bool=false função GetIEMICode ()-> String { retornar"IEMEICode" } função SendMessage ()-> String { retornar"Mensagem enviada" } func Dial ()-> String { retornar"discado" } função Receive ()-> String { retornar"Recebendo chamada" } }
Observe que a palavra-chave mutating
na linha 9 funciona quando temos um objeto que deve alterar uma de suas propriedades. Devemos especificar que GetIEMICode ()
é um método mutante em nosso protocolo. Em nossa estrutura, também devemos especificar a palavra-chave mutating
, mas não na classe.
Vantagens dos protocolos em Swift
A partir dos exemplos acima, podemos ver porque os protocolos são úteis e porque o Swift usa o paradigma orientado a protocolo. As vantagens de usar protocolos se manifestam das seguintes maneiras:
Clareza do código
Os protocolos de nomenclatura fornecem um melhor entendimento de suas instâncias. Em nosso primeiro exemplo, criamos um EmployeeProtocol
que está em conformidade com a classe Employee
, mostrando como os protocolos oferecem significado para classes, enums ou structs.
Como Dave Abrahams disse na WWDC 2015 , “Não comece com uma aula, comece com um protocolo. ”
Reutilização
Com extensões de protocolo, podemos ter uma implementação padrão para nosso método na classe, enum ou estrutura com a qual estão em conformidade. Podemos ver isso no código abaixo:
protocolo Pessoa { var name: String {get} var age: Int {get} var gender: String {get} func speak () } extensão Pessoa { func speak () { print ("Olá, isso funciona!") } } classe Masculino: Pessoa { nome da var: String="" var age: Int=23 var gender: String="Masculino" } struct Feminino: Person { var name: String var age: Int var gender: String }
Ao criar uma funcionalidade padrão usando a palavra-chave extension
na linha 9, não precisamos repeti-la em nossa classe ou estrutura.
Separação de classes
Os protocolos também eliminam a necessidade de classes, enums e structs dependerem uns dos outros porque não usam herança.
Conclusão
Em resumo, os protocolos em Swift oferecem comunicação entre objetos não relacionados, onde definimos os métodos e variáveis observados em classes, enums e structs. Como o Swift adota o paradigma orientado a protocolo, podemos modelar nosso sistema antes de definir classes, estruturas ou enums, tornando o processo mais eficiente.
A postagem Compreendendo os protocolos em Swift apareceu primeiro em LogRocket Blog .