Creo que no entiendo cómo se supone que funcionan las extensiones de protocolo.
Intenté esto:
protocol P { var h: [String: Any] { set get } } extension P { var h: [String: Any] { get { return [:] } set {} } } struct S: P { init() { self.h = ["o": "o"] } } Mi objetivo es que S tenga las propiedades de P y no necesite volver a declararlo en la definición de estructura.
Sin embargo, cuando creo let s = S() , sh siempre es igual a [:] y no ["o":"o"] .
Por supuesto, esto se debe a que mi colocador está vacío, pero no sé cómo hacer lo que quiero lograr aquí.
Gracias por tu ayuda.
Mi objetivo es que S tenga las propiedades de P y no necesite volver a declararlo en la definición de estructura.
Eso no es posible en la forma en que estás tratando de hacer esto. Los protocolos requieren ciertos comportamientos. Los tipos conformes deben proporcionar esos comportamientos. Si necesita almacenamiento para implementar el comportamiento, entonces el tipo conforme debe proporcionar el almacenamiento.
Está bien si no desea almacenamiento, entonces la extensión puede devolver valores como los suyos. Pero no puede devolver valores calculados y también tener almacenamiento. Lo que intentas hacer no es posible. Estás pensando en clases, no en protocolos. (Si quieres clases, está bien. Usa clases. No tienen nada de malo).
Una buena manera de pensar por qué esto no es posible en Swift es considerar el siguiente caso. Suponga que su protocolo P existe de alguna forma que logra lo que desea. Ahora en un módulo definimos:
struct S {} Esta estructura no requiere almacenamiento. Cualquier llamada a S() en ese módulo no asigna nada. (Alternativamente, asigne a S algunas propiedades y asignará una cantidad específica de memoria).
Ahora, en algún otro módulo, extienda S para ajustarse a P :
extension S: P {} ¿Adónde iría el almacenamiento de h ? Es posible que ya existan instancias en el momento en que esta extensión esté cargada. ¿Qué pasaría si hubiera múltiples protocolos que quisieran almacenamiento adicional y todos estuvieran conectados a S . ¿Qué compensaciones en la estructura S deberían ser esas propiedades? El orden sería muy importante para el código compilado. Esto no es imposible de resolver (ObjC lo hace usando una técnica llamada objetos asociados), pero es una gran adición al lenguaje y evita una serie de optimizaciones importantes, y Swift no hace las cosas de esa manera.
Estuvo cerca, solo tiene que replantear la variable h en la S Struct
protocol P { var h: [String: Any] { set get } } extension P { var h: [String: Any] { get { return [:] } set {} } } struct S: P { var h: [String: Any] init() { self.h = ["o": "o"] } } let s = S() print(sh) // ["o": "o"]