Aparentemente, de la nada, comencé a recibir cientos de errores asociados con dos funciones de extensión que uso con frecuencia.
Intenté comentar todo el código nuevo que precede a este error. También intenté limpiar mi carpeta de compilación. ¿Cómo me deshago del error que se encuentra en el título de esta publicación? ¿Por qué apareció aleatoriamente cuando he estado usando estas extensiones con éxito durante meses?
extension UITableViewCell { public func getSize(large: CGFloat, medium: CGFloat, small: CGFloat) -> CGFloat { var size = CGFloat() let screenHeight = Int(UIScreen.main.bounds.height) if screenHeight >= 800 { size = large } else if screenHeight >= 600 { size = medium } else { size = small } return size } public func formatPrice(_ price: Int) -> String { let lastDigit = price % 10 var stringPrice = "" if lastDigit == 0 { stringPrice = "$\(Double(price) / 100)0" } else { stringPrice = "$\(Double(price) / 100)" } return stringPrice } }Si agrega funciones a una clase en una extensión (es decir, no están en la definición de clase), esos métodos se envían estáticamente en Swift porque el compilador no puede agregar los métodos a la vtable de la clase (es decir, la vtable debe crearse en tiempo de compilación , pero puede agregar una extensión más tarde, como en otro módulo). Esta es la razón por la que el compilador se queja de que no puede override los métodos (es decir, no son virtuales).
El envío de Objective C funciona de manera diferente, a través de la tabla de selección y se puede modificar incluso en tiempo de ejecución. Es por eso que el compilador dice que use @objc y, efectivamente, si hace esto, funcionará.
EJEMPLO:
Esto no se compila porque estamos tratando de anular y enviar dinámicamente una función no virtual enviada estáticamente en Swift
extension UITableViewCell { func a() { print("UITableViewCell") } } class B: UITableViewCell { override func a() { print("B") } } let b = B() print(ba())Esto funciona e imprime "B" porque está usando el envío del selector objc
import UIKit import PlaygroundSupport extension UITableViewCell { @objc func a() { print("UITableViewCell") } } class B: UITableViewCell { override func a() { print("B") } } let b = B() print(ba())