programacion - protocolos swift
Emitir una advertencia para un método de protocolo Swift en desuso en la implementación de tipos (2)
Si entiendo la pregunta correctamente, no creo que haya una manera de hacer esto, ni debería haberlo.
Tienes un protocolo, llamémoslo MyProtocol
...
protocol MyProtocol {
func myOldFunction()
}
extension MyProtocol {
func myOldFunction() {
print("doing my old things")
}
}
Y en una versión posterior, le gustaría cambiar el nombre de una función dentro de su protocolo.
protocol MyProtocol {
func myOldFunction() // now deprecated
func myNewFunction()
}
El problema principal al lanzar una advertencia de MyProtocol
en cualquier clase que se ajuste a MyProtocol
e implemente myOldFunction()
es que no hay nada de malo con las clases que implementan funciones y propiedades que no son parte de su protocolo.
Estos métodos o propiedades aún pueden ser implementaciones perfectamente válidas utilizadas por otras cosas que no se preocupan por su protocolo.
Considere que nada nos detendría de hacer esto:
protocol ViewControllerDeprecations {
func viewDidLoad() // mark deprecated
func viewWillAppear(Bool) // mark deprecated
// etc., for all the life cycle methods
}
extension UIViewController: ViewControllerDeprecations {}
Ahora, cada subclase de UIViewController
en todas partes en cualquier aplicación que contenga el archivo con el código anterior tiene estas tontas advertencias de UIViewController
simplemente porque su protocolo en particular ya no usa estos métodos.
Supongamos que tengo un protocolo con un método bar()
que tiene una implementación predeterminada, esencialmente la manera Swift de hacer un requisito de protocolo opcional para implementar tipos:
protocol Foo {
func bar()
}
extension Foo {
func bar() {
print("default bar() implementaion")
}
}
Ahora supongamos que decido renombrar ese método barrrr()
, porque más r
s son mejores:
protocol Foo {
func barrrr()
}
extension Foo {
func barrrr() {
print("default barrrr() implementaion")
}
}
El código existente aún puede implementar el método con el nombre anterior:
class Thinger: Foo {
func bar() {
print("custom bar() implementaion")
}
}
Este código piensa que está personalizando un método Foo
, pero no lo es. Las personas que llaman buscarán barrrr()
y obtendrán la implementación predeterminada. Nadie llama a bar()
.
Por lo tanto, me gustaría generar una advertencia para los tipos que implementan Foo
y tienen un método bar()
. Esto no funciona:
protocol Foo {
func barrrr()
@available(*, deprecated: 0.99, renamed: "barrrr()")
func bar()
}
extension Foo {
func barrrr() {
print("default barrrr() implementaion")
}
func bar() {
fatalError("renamed barrrr()")
}
}
class Thinger: Foo {
func bar() { // No warning here!
print("custom bar() implementaion")
}
}
Hacer que el método de extensión sea final
no tiene ningún efecto. ¿Hay una manera de hacerlo? No necesita ser una amistosa advertencia; cualquier error del compilador sería suficiente.
Sin tomar una posición sobre si es algo bueno, como sugiere otra respuesta , no es posible exactamente lo que está pidiendo, al menos en Swift 3.
Sin embargo, como señalé en respuesta a una pregunta relacionada , es posible desaprobar un protocolo completo, y al hacerlo, al menos, obtendría advertencias de depreciación en el nivel de tipo de implementación, si no precisamente en el nivel de propiedad / método deseado.