Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

367
Views
Extensión del protocolo Swift: no se puede asignar a la propiedad: '' es una propiedad de solo obtención

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.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report

0

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"]
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!