Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

368
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda