/ Comportamiento de subclase de extensión de palabra clave / @objc - swift, swift4, swift4.1

Comportamiento de subclase de extensión de palabra clave @objc - swift, swift4, swift4.1

¿Alguien puede explicar por qué? @objc Se necesita palabra clave aquí para compilar el código?

Como entendí, esta palabra clave se usa para trabajar el envío del método de mensaje ObjC. Pero esto no es un NSObject ejemplo.

 class MyClass { }
extension MyClass {
@objc func extensionMethod() { /// THIS LINE
print("A")
}
}

class SubClass: MyClass {
override func extensionMethod() {
print("B")
}
}

Hace @objc palabra clave habilitar el envío de mensajes, así como dynamic? ¿O no?

Respuestas

6 para la respuesta № 1

Hace @objc palabra clave habilitar el envío de mensajes, así como dynamic?

No Usualmente. Por lo general, el @objc el atributo en sí mismo solo expone un miembro de clase dado a Objective-C - Swift todavía es libre de enviarlo mediante tabla o envío estático. Necesitarías marcar el miembro como dynamic si quieres que Swift use el envío de mensajes cuando lo llames.

Sin embargo, para un no final @objc clase extensión miembro, Swift lo deducirá automáticamente como dynamic. ¿Por qué? Porque por razones de interoperabilidad, Swift permite @objc miembros de la extensión para anular y ser anulados (de manera similar a cómo se puede anular un método Obj-C en una categoría de subclase). Para lograr este comportamiento, Swift se basa en el envío de mensajes Obj-C.

Por lo tanto, en una extensión, @objc infiere dynamic. No puede anular un miembro de extensión sinexponerlo al tiempo de ejecución de Obj-C porque los miembros de la extensión no se pueden agregar actualmente a la clase vtable de Swift (ya que actualmente las vtables de Swift no pueden tener miembros agregados dinámicamente en el tiempo de ejecución).

Pero esto no es un NSObject ejemplo.

En las plataformas Apple (es decir, aquellas con interoperabilidad Obj-C), todas Las clases de Swift están expuestas al tiempo de ejecución de Obj-C, y todas se heredan implícitamente de una clase base especial de Obj-C llamada _SwiftObject, que se ajusta a NSObjectProtocol. Así que las clases Swift pueden aprovechar el envío de mensajes sin tener que heredar de NSObject.