Busqué algunas publicaciones, creo que no puedo escribir una extensión en Swift y llamarla desde el código Objective-C, ¿verdad?
¿Los atributos similares a @objc solo admiten métodos, clases, protocolos?
objective-c
swift
swift-extensions
sprhawk
fuente
fuente
Respuestas:
Puede escribir una extensión Swift y usarla en el código Objective-C. Probado con XCode 6.1.1.
Todo lo que necesitas hacer es:
crea tu extensión en Swift (sin
@objc
anotaciones)#import "ProjectTarget-Swift.h"
en su clase Objective-C (donde "ProjectTarget" representa el destino XCode con el que está asociada la extensión Swift)llamar a los métodos desde la extensión Swift
Actualización: a partir de @Rizwan Ahmed mencionado, debe agregar una
@objc
anotación:fuente
Descubrí que en Swift 4.0 tenía que agregar
@objc
delante de mi palabra clave de extensión para que los métodos de extensión Swift fueran visibles por una instancia de la clase Objc que estaba extendiendo.En breve:
Configuración de archivo de configuración:
En CustomClassExtension:
En mi AppDelegate.m:
fuente
@nonobjc
anotación.Esta solución funciona para Swift 2.2 y Swift 3 . Tenga en cuenta que solo las extensiones para clases (no para estructuras o enumeraciones) serán accesibles desde Objective-C.
Luego, #importe "ProductModuleName-Swift.h" en su archivo ObjC.
Rápido 4
fuente
public
es necesario? Funciona bien sinpublic
modificador para mí. ¿Estamos asumiendo que la extensión no está en el mismo proyecto sino que se está importando de otro proyecto?Como se explica en las otras respuestas, la importación del encabezado Swift generado funciona en la mayoría de los casos .
Una excepción a esto es cuando la categoría se define en un tipo puente (es decir, la extensión se define en
String
y noNSString
). Estas categorías no se vincularán automáticamente con sus contrapartes de Objective-C. Para evitar esto, deberá usar el tipo Objective-C (y emitir el valor de retorno en su código Swift conas String
) o definir una extensión para los tipos Swift y Objective-C.fuente
public extension NSString
. Si obtiene un identificador no resuelto o un error similar en el momento de la compilación, puede volver alet sVal = self as String
sVal
mclaughlinj
dijo, tanto para la clase NSString como para la estructura StringImporte el encabezado "#import" ProductModuleName-Swift.h " en el archivo objetivo-c y agregue @objc delante de su extensión en un archivo rápido. Funcionará bien en swift 4.2 y swift 5
fuente