Tengo un antiguo proyecto de Objective-C y quiero llamar a una nueva función y objeto Swift, he creado el archivo " <ProjectName>-Bridging-Header.h
" y " <ProjectName>-Swift.h
"
Fue fácil para mí llamar a la función de Swift a Objective-C pero tengo un problema para revertir.
Así que he creado una clase simple "System.Swift"
import Foundation
@objc class System : NSObject {
@objc func printSome() {
println("Print line System");
}
}
ahora he intentado seguir la documentación aquí y dentro del <...>-Swift.h
archivo escribí esto
@class System;
@interface System : NSObject
-(void)printSome;
@end
y lo he importado dentro de mi clase Objective-C. En este punto, dentro de mi clase Objective C (actualmente UIViewController) de mi código Objective-C, he intentado llamar al método "printSome":
- (void)viewDidLoad
{
[super viewDidLoad];
System * sis = [[System alloc] init];
[sis printSome];
//any additional setup after loading the view from its nib.
}
ahora tengo el siguiente error:
Símbolos no definidos para la arquitectura i386: " OBJC_CLASS $ _System", referenciado desde: objc-class-ref en "ObjectiveC_Class_That_Call_Swift_Object" .o ld: símbolo (s) no encontrado para la arquitectura i386 clang: error: el comando del enlazador falló con el código de salida 1 (use -v para ver la invocación)
fuente
Respuestas:
Problema resuelto, anteriormente creé e incluí un nuevo
.h
archivo en mi clase Objective-C llamado<ProductModuleName>-Swift.h
pero, como descubrí más tarde, este paso no es necesario porque el compilador crea el archivo necesario invisible.Simplemente inclúyalo
<ProductModuleName>-Swift.h
en su clase y debería funcionar.fuente
@objc
prefijo. Se-Swift.h
ha creado automáticamente. Lo que me está dando dolor de cabeza es que puedo llamar a la clase en sí, pero no a ninguna función dentro de ella. ¿Alguien sabe por qué?<productModuleName>-.Swift.h
(nomodel
).#import "My_Project-Swift.h"
.es extraño pero funcionará
1) Add @objc to Swift class 2) Add in .m #import "(ProjectName)-Swift.h" 3) Call from .h @class SwiftClass; 4)On SwiftClass click "Command" + Left Click (Apple Documantation) 5) To see "-Swift.h" -> click "Command" + Left Click
La aplicación generará la interfaz para esta clase en -Swift.h
Ejemplo: SWIFT_CLASS ("_ TtC10Project17220PLHelper") @interface PLHelper
fuente
@objc (MyClassName)
(ProjectName)-Swift.h
, NOT(ClassName)-Swift.h
!3) @class SwiftClassName;
me salvóSupongamos que tenemos ProjectName "MyFirstProjectOnSwift" y el nombre de clase rápida "mySwiftClass" y la clase aimC es "MyObjectiveCLass"
Los siguientes pasos son: -
fuente
Verifique el archivo -Swift.h que tiene la importación en su archivo .m en objetivo-C:
#import <YourProjectName-Swift.h>
Haga clic en esa línea y haga clic con el botón izquierdo - Ir a definición.
Este archivo debe incluirse automáticamente, no manualmente.
fuente
Si aún no ve su clase incluso después de importar
<ProductModuleName>-Swift.h
.Asegúrese de que su clase esté subclasificando una clase nativa (por ejemplo
UIViewController
) o al menos si es solo una clase de utilidad, conviértala en subclaseNSObject
. Tu clase debería aparecer ahora.fuente
Un pequeño consejo adicional para cualquiera que se encuentre con esta publicación y para quienes las otras respuestas no funcionan: es posible que también deba declarar su clase Swift como "pública".
Ejemplo:
@objc public class MySwiftClass: NSObject {
fuente
La forma recomendada de ejecutar código Swift desde Objective-C en proyectos que se están migrando de Obj-C a Swift es utilizando el patrón Bridge / Proxy.
import Foundation
@objc class AnalyticsPropertyBridge: NSObject {
private var analytics: AnalyticsManager = AnalyticsManager() @objc func refreshProperties() { self.analytics.set(AnalyticsProperty.clientType) }
}
#import "CallerModule.h"
3.a Importar archivo de paraguas:
#import "MyProject-Swift.h"
3.b Llame al puente.
[[AnalyticsPropertyBridge new] refreshProperties];
Beneficios: Su código rápido no se ensuciará con @objc porque el código se llama desde Objc. Con el paso del tiempo, el ObjC se irá reduciendo en tu proyecto y finalmente la novia será eliminada.
fuente
Un buen artículo aquí por si alguien todavía tiene problemas.
Configuración de la interoperabilidad de Swift y Objective-C
fuente