protocol medium extension example delegate and swift struct linker protocols

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:

  1. Cambia tus modelos de struct a class . No tengo idea de por qué esto funciona.

  2. 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í