¿Existe una forma estándar de hacer una "función virtual pura" en Swift, es decir. uno que debe ser anulado por cada subclase, y que, si no es así, causa un error de tiempo de compilación?
swift
abstract
swift-protocols
JuJoDi
fuente
fuente
protocol
S implementa una función virtual pura (en comparación coninterface
s en Java) Si necesita usarlos como métodos abstractos, consulte esta pregunta / respuesta: stackoverflow.com/a/39038828/2435872Respuestas:
Tienes dos opciones:
1. Utilice un protocolo
Definir la superclase como Protocolo en lugar de Clase
Ventaja : compile la verificación de tiempo para ver si cada "subclase" (no una subclase real) implementa los métodos requeridos
Desventaja : la "superclase" (protocolo) no puede implementar métodos o propiedades
2. Afirmar en la super versión del método
Ejemplo:
Ventaja : puede implementar métodos y propiedades en superclase
Desventaja : Sin verificación de tiempo de compilación
fuente
fatalError
no proporciona verificación en tiempo de compilación, es bueno que el compilador sea al menos lo suficientemente inteligente como para no requerir que proporciones un valor de retorno para el método cuando la ruta de ejecución llamafatalError
.super.someFunc()
desde el método anulado, obtiene el error a pesar de que lo anuló. Sabes que se supone que no debes llamarlo, pero alguien más no tiene que saber eso y simplemente seguir la práctica estándar.Lo siguiente permite heredar de una clase y también tener la verificación del tiempo de compilación del protocolo :)
fuente
No hay soporte para funciones virtuales / clases abstractas, pero probablemente podría usar un protocolo para la mayoría de los casos:
Si SomeClass no implementa someMethod, obtendrá este error de tiempo de compilación:
fuente
Otra solución, si no tiene demasiados métodos "virtuales", es hacer que la subclase pase las "implementaciones" al constructor de la clase base como objetos de función:
fuente
Puede usar protocolo frente a aserción como se sugiere en la respuesta aquí de
drewag
. Sin embargo, falta un ejemplo del protocolo. Estoy cubriendo aquí,Protocolo
Ahora se requiere que todas las subclases implementen el protocolo que se verifica en tiempo de compilación. Si SomeClass no implementa someMethod, obtendrá este error de tiempo de compilación:
Nota: esto solo funciona para la clase superior que implementa el protocolo. Cualquier subclase puede ignorar alegremente los requisitos del protocolo. - como se ha comentado por
memmons
Afirmación
Sin embargo, la aserción solo funcionará en tiempo de ejecución.
fuente
Siendo nuevo en el desarrollo de iOS, no estoy del todo seguro de cuándo se implementó, pero una forma de obtener lo mejor de ambos mundos es implementar una extensión para un protocolo:
La extensión es lo que le permite tener el valor predeterminado para una función, mientras que la función en el protocolo regular aún proporciona un error de tiempo de compilación si no está definida
fuente