Existe uma maneira padrão de fazer uma "função virtual pura" em Swift, ou seja. um que deve ser substituído por cada subclasse e que, se não for, causa um erro de tempo de compilação?
swift
abstract
swift-protocols
JuJoDi
fonte
fonte
protocol
s (em comparação cominterface
s em Java) Se você precisar usá-los como métodos abstratos, dê uma olhada nesta pergunta / resposta: stackoverflow.com/a/39038828/2435872Respostas:
Você tem duas opções:
1. Use um protocolo
Defina a superclasse como um protocolo em vez de uma classe
Pro : verificar o tempo de compilação para ver se cada "subclasse" (não uma subclasse real) implementa os métodos necessários
Contra : A "superclasse" (protocolo) não pode implementar métodos ou propriedades
2. Afirmar na super versão do método
Exemplo:
Pro : pode implementar métodos e propriedades na superclasse
Contra : Sem verificação de tempo de compilação
fonte
fatalError
não forneça verificação em tempo de compilação, é bom que o compilador seja pelo menos inteligente o suficiente para não exigir que você forneça um valor de retorno para o método quando o caminho de execução for chamadofatalError
.super.someFunc()
partir do método sobrescrito, receberá o erro apesar de tê-lo sobrescrito. Você sabe que não deve chamá-lo, mas outra pessoa não precisa saber disso e apenas seguir a prática padrão.O seguinte permite herdar de uma classe e também ter a verificação do tempo de compilação do protocolo :)
fonte
Não há suporte para classes abstratas / funções virtuais, mas você provavelmente poderia usar um protocolo para a maioria dos casos:
Se SomeClass não implementar someMethod, você receberá este erro de tempo de compilação:
fonte
Outra solução alternativa, se você não tiver muitos métodos "virtuais", é fazer com que a subclasse passe as "implementações" para o construtor da classe base como objetos de função:
fonte
Você pode usar protocolo versus asserção conforme sugerido na resposta aqui por
drewag
. No entanto, falta um exemplo para o protocolo. Estou cobrindo aqui,Protocolo
Agora, todas as subclasses são necessárias para implementar o protocolo que é verificado em tempo de compilação. Se SomeClass não implementar someMethod, você receberá este erro de tempo de compilação:
Observação: isso só funciona para a classe superior que implementa o protocolo. Qualquer subclasse pode ignorar alegremente os requisitos do protocolo. - como comentado por
memmons
Afirmação
No entanto, a asserção funcionará apenas em tempo de execução.
fonte
Sendo novo no desenvolvimento de iOS, não tenho certeza de quando isso foi implementado, mas uma maneira de obter o melhor dos dois mundos é implementar uma extensão para um protocolo:
A extensãoéo que lhe permite ter o valor padrão para uma função enquanto a função no protocolo regular ainda fornece um erro de tempo de compilação se não for definido
fonte