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