Existe-t-il un moyen standard de créer une "fonction virtuelle pure" dans Swift, ie. celui qui doit être remplacé par chaque sous-classe, et qui, si ce n'est pas le cas, provoque une erreur de compilation?
swift
abstract
swift-protocols
JuJoDi
la source
la source
protocol
s (par rapport àinterface
s en Java) Si vous avez besoin de les utiliser comme des méthodes abstraites, regardez cette question / réponse: stackoverflow.com/a/39038828/2435872Réponses:
Vous avez deux options:
1. Utilisez un protocole
Définir la superclasse comme un protocole au lieu d'une classe
Pro : vérification du temps de compilation pour savoir si chaque "sous-classe" (pas une sous-classe réelle) implémente la ou les méthodes requises
Inconvénient : la "superclasse" (protocole) ne peut pas implémenter de méthodes ou de propriétés
2. Affirmer dans la super version de la méthode
Exemple:
Pro : Peut implémenter des méthodes et des propriétés en superclasse
Inconvénient : pas de vérification du temps de compilation
la source
fatalError
qu'il ne fournisse pas de vérification au moment de la compilation, il est bon que le compilateur soit au moins suffisamment intelligent pour ne pas vous obliger à fournir une valeur de retour pour la méthode lorsque le chemin d'exécution est appeléfatalError
.super.someFunc()
partir de la méthode surchargée, vous obtenez l'erreur malgré le fait que vous l'avez remplacée. Vous savez que vous n'êtes pas censé l'appeler, mais quelqu'un d'autre n'a pas besoin de le savoir et de simplement suivre la pratique standard.Ce qui suit permet d'hériter d'une classe et aussi de vérifier l'heure de compilation du protocole :)
la source
Il n'y a pas de support pour la classe abstraite / les fonctions virtuelles, mais vous pouvez probablement utiliser un protocole dans la plupart des cas:
Si SomeClass n'implémente pas someMethod, vous obtiendrez cette erreur de compilation:
la source
Une autre solution de contournement, si vous n'avez pas trop de méthodes "virtuelles", consiste à demander à la sous-classe de passer les "implémentations" dans le constructeur de classe de base en tant qu'objets de fonction:
la source
Vous pouvez utiliser protocole vs assertion comme suggéré dans la réponse ici par
drewag
. Cependant, l'exemple du protocole est manquant. Je couvre ici,Protocole
Désormais, toutes les sous-classes doivent implémenter le protocole qui est vérifié au moment de la compilation. Si SomeClass n'implémente pas someMethod, vous obtiendrez cette erreur de compilation:
Remarque: cela ne fonctionne que pour la classe la plus élevée qui implémente le protocole. Toutes les sous-classes peuvent ignorer allègrement les exigences du protocole. - comme commenté par
memmons
Affirmation
Cependant, l'assertion ne fonctionnera que pendant l'exécution.
la source
Étant nouveau dans le développement iOS, je ne sais pas vraiment quand cela a été implémenté, mais une façon d'obtenir le meilleur des deux mondes est d'implémenter une extension pour un protocole:
L'extension est ce qui vous permet d'avoir la valeur par défaut pour une fonction tandis que la fonction dans le protocole régulier fournit toujours une erreur de compilation si elle n'est pas définie
la source