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

407
Visualizações
¿Por qué no puedo declarar una variable dinámica dentro del protocolo?

Actualmente estoy trabajando en protocolos para mis objetos que heredan de Realm's Object . Dentro de mis objetos tengo variables y estas variables están marcadas como @objc dynamic

 @objc dynamic var title: String = ""

Ahora imagina una situación en la que tengo más objetos similares con el mismo title de variable. Quiero crear un protocolo para ellos, ya que quiero tener solo un método genérico para cambiar el título del objeto.

Entonces, creé un protocolo con la variable de title marcada como @objc dynamic con la expectativa de que así es como funciona

 protocol Titleable: class { @objc dynamic var title: String { get set } }

... esto no funcionó y en realidad recibí dos errores.

Uno sobre marcar variable como @objc

@objc solo se puede usar con miembros de clases, protocolos @objc y extensiones concretas de clases

... esto lo podría resolver marcando el protocolo como @objc .

Sin embargo, todavía tenía un error relacionado con la palabra clave dynamic

Solo los miembros de las clases pueden ser dinámicos.

... Pensé que cuando restringí el protocolo para las clases, debería estar bien, pero... no fue así.

De alguna manera lo resolví eliminando @objc y palabras clave dynamic

 protocol Titleable: class { var title: String { get set } }

... eso funciona. Puedo marcar la variable como @objc dynamic en la clase donde implemento este protocolo.

 class Item: Object, Titleable { @objc dynamic var title: String = "" }

Sin embargo, no estoy seguro de por qué esto funciona y por qué marcar la variable como dynamic dentro de la declaración del protocolo no lo hace. Agradecería cualquier explicación.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Mira lo que significa dynamic :

dinámica

Aplique este modificador a cualquier miembro de una clase que pueda ser representado por Objective-C. Cuando marca una declaración de miembro con el modificador dinámico, el acceso a ese miembro siempre se distribuye dinámicamente mediante el tiempo de ejecución de Objective-C. El compilador nunca inserta ni desvirtualiza el acceso a ese miembro.

Dado que las declaraciones marcadas con el modificador dinámico se envían mediante el tiempo de ejecución de Objective-C, deben marcarse con el atributo objc.

Considere particularmente ese primer párrafo. Dice que algo que está marcado como dynamic no puede ser despachado estáticamente. Ahora considere el caso en el que tengo alguna clase en un módulo. Ya ha sido compilado, y sus métodos fueron despachados estáticamente. Ahora considere otro módulo que conforme esa clase a algún protocolo que incluya un método dynamic . ¿Cómo puede funcionar eso? El método ya ha sido despachado estáticamente en algunos lugares. No se puede transformar retroactivamente en despacho dinámico. (Lo mismo puede aplicarse a las declaraciones en el mismo módulo dependiendo de los indicadores del compilador y los niveles de acceso, pero me resulta más fácil explicar el módulo cruzado).

La razón principal por la que querría hacer esto en cualquier caso es para asegurarse de que puede usar KVO en esa propiedad. (Si tiene alguna otra razón por la que necesita obligar a los tipos conformes a usar una propiedad dinámica, me interesa saber el caso de uso). Si ese es su objetivo, probablemente requiera que Titleable se ajuste a NSObjectProtocol .

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