medium - swift protocol and delegate example
Declarar conformidad de protocolo trivial para struct en un marco (2)
Error interesante que encontraste Usted y Scott H hicieron todo el trabajo, pero quisieron intervenir con algunas soluciones:
Cambia tus modelos de
struct
aclass
. No tengo idea de por qué esto funciona.Las funciones también funcionan (es decir,
func temperature() -> Float
).
Ambos son menos que ideales.
¿Es posible declarar que struct a struct, definida en un framework, se ajusta trivialmente a un protocolo, definido en mi aplicación?
Digamos, por ejemplo, que tengo una API que declara estructuras para algunos widgets modelados en un marco:
public struct VagueWidget {
public let temperature: Float
}
public struct SpecificWidget {
public let calibratedTemperature: Float
public let movingAverageTemperature: Float
}
public struct SuperSpecificWidget {
public let surfaceTemperature: Float
public let inferredCoreTemperature: Int?
}
Y luego en mi aplicación quiero generalizar estos a través de un protocolo.
protocol Widget {
var temperature: Float { get }
}
En mi aplicación, puedo declarar estructuras similares a las de la API y declararlas trivialmente como conformes al protocolo.
struct MockWidget {
let temperature: Float
}
extension MockWidget: Widget {}
Y luego puedo declarar la conformidad del protocolo para las estructuras en el marco.
extension SuperSpecificWidget: Widget {
var temperature: Float {
get {
return surfaceTemperature
}
}
}
extension SpecificWidget: Widget {
var temperature: Float {
get {
return calibratedTemperature
}
}
}
extension VagueWidget: Widget {}
Este código compila, pero no enlaza. El VagueWidget
conformación VagueWidget
en el marco que es equivalente al MockWidget
en la aplicación da como resultado un símbolo que falta:
Undefined symbols for architecture x86_64:
"WidgetAPI.VagueWidget.temperature.getter : Swift.Float", referenced from:
protocol witness for WidgetApp.Widget.temperature.getter : Swift.Float in conformance WidgetAPI.VagueWidget : WidgetApp.Widget in WidgetApp in AppModel.o
Comentando la conformidad del protocolo trivial para el VagueWidget
produce código que se compila y ejecuta, pero obviamente falta la conformidad del protocolo deseado. He agregado un proyecto de ejemplo en github.
Actualización: parece ser un problema conocido. He archivado un radar, y fue cerrado como un duplicado de 20648441 .
extension WidgetAPI.VagueWidget: Widget {
var temperature: Float {
return self.temperature
}
}
Lo arregla Parece ser un tipo de conflicto con la propiedad inmutable almacenada frente a la propiedad de solo lectura computada en el protocolo.
Actualización: No importa, acabo de descubrir la recursión infinita. Todavía parece que hay algo allí