objective-c - programar - swift(lenguaje de programación)
Importación de un protocolo Swift en la clase Objective-C (3)
Intento importar un Protocolo Swift llamado AnalyticProtocol
en una clase Objective-C llamada AnalyticFactory
.
protocol AnalyticProtocol
{
}
Estoy empezando a partir de un proyecto Objective-C existente (no creé un nuevo proyecto Swift con xCode y no encontré cómo configurar mi proyecto Objective-C para que sea un proyecto Swift en xCode 6 ).
En mi archivo Swift MyProjectName-Swift.h
el archivo .h
llamado MyProjectName-Swift.h
pero el compilador me devuelve un error que me dice que no existe . Entonces, creé un archivo .h
llamado MyProjectName-Swift.h
que en realidad está vacío (no sé qué debería poner dentro).
En la documentación de Apple , dijeron que tengo que incluir mi archivo .h
llamado MyProjectName-Swift.h
en mi archivo .m
. Pero necesito incluirlo no en mi archivo .m
, sino en mi .h
. ¿Esto puede ser problemático?
Cuando intento compilar tengo este error:: 0: error: xxxAnalyticFactory.h: 39: no puedo encontrar la declaración de protocolo para ''AnalyticProtocol''
Y el código incriminado:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
Creo que no entiendo bien cómo puedo importar un protocolo Swift en una clase Objective-C.
¿Alguien ve un error en lo que estoy haciendo?
Necesita agregar el atributo @objc
a su protocolo Swift de la siguiente manera:
@objc protocol AnalyticProtocol {
}
No es posible importar el encabezado Swift generado por Xcode en archivos de encabezado objC.
Entonces, dado que quiere usar el código Swift en un archivo de encabezado objC, necesitará "reenviar declarar" las clases y protocolos que desea usar en el archivo de encabezado objC, así:
@protocol AnalyticProtocol;
Ahora puede usar el protocolo en su declaración de clase objC:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
En su archivo de implementación (el archivo objC .m), puede importar el archivo encabezado Swift generado por Xcode ("NombreMóduloProducto-Swift.h") y el compilador ahora conocerá la implementación correcta AnalyticProtocol
.
Esto también se describe en la sección "Uso de Swift de Objective-C" en Apple Docs
Tenga en cuenta que XCode dará una advertencia en el archivo de encabezado objC cuando use el protocolo de envío directo ("No se puede encontrar la definición de protocolo para ''AnalyticProtocol''), pero esto se puede ignorar; la implementación se encontrará en tiempo de compilación.
Para cualquiera que simplemente necesite adoptar un protocolo, puede hacerlo en dos pasos, sin generar advertencias o errores:
En su archivo
.swift
, agregue@objc
antes del nombre del protocolo:@objc protocol AnalyticProtocol { }
En su archivo
.m
, importe el encabezado Swift generado y adopte el protocolo en una categoría privada. (El archivo de encabezado se denomina automágicamente):#import "ProductModuleName-Swift.h" @interface AnalyticFactory () <AnalyticProtocol> @end
Este es el enfoque recomendado de Apple. Puede obtener más información sobre cómo mezclar y combinar Objective-C y Swift aquí: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html