Intento importar un protocolo Swift nombrado AnalyticProtocol
en una clase Objective-C llamada AnalyticFactory
.
protocol AnalyticProtocol
{
}
Estoy comenzando desde 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 incluí el .h
archivo nombrado MyProjectName-Swift.h
pero el compilador me devolvió un error diciéndome que no existe . Entonces, creé un .h
archivo llamado MyProjectName-Swift.h
que en realidad está vacío (no sé qué debo poner dentro).
En la documentación de Apple dijeron que tengo que incluir mi .h
archivo nombrado MyProjectName-Swift.h
en mi .m
archivo. Pero necesito incluirlo no en mi .m
archivo sino en mi .h
. ¿Esto puede resultar problemático?
Cuando intento compilar, obtengo 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 a una clase Objective-C.
¿Alguien ve un error en lo que estoy haciendo?
fuente
Respuestas:
Debe agregar el
@objc
atributo a su protocolo Swift de esta manera:fuente
@interface
en el.h
archivo. sin embargo, puede agregar el protocolo al privado@interface
en el.m
archivo y arregla las cosas (al menos lo ha hecho para mí en ocasiones). Así que por encima de tu@implementation
tienes@interface MyController() <AnalyticProtocol>
.No es posible importar el encabezado Swift generado por Xcode en archivos de encabezado objC.
Entonces, dado que desea usar el código Swift en un archivo de encabezado objC, deberá "declarar hacia adelante" las clases y protocolos que desea usar en el archivo de encabezado objC, así:
Ahora puede usar el protocolo en su declaración de clase objC:
En su archivo de implementación (el archivo objC .m), puede importar el archivo de encabezado Swift generado por Xcode ("ProductModuleName-Swift.h") y
AnalyticProtocol
ahora el compilador conocerá la implementación correcta .Esto también se describe en la sección "Uso de Swift desde Objective-C" en Apple Docs
Tenga en cuenta que XCode dará una advertencia en el archivo de encabezado objC cuando use el protocolo declarado hacia adelante ("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.
fuente
No visible @interface for <ClassName> declares the selector <protocolMethodName>
Para cualquiera que simplemente necesite adoptar un protocolo, puede hacerlo en dos pasos, sin generar advertencias ni errores:
En su
.swift
archivo, agregue@objc
antes del nombre del protocolo:En su
.m
archivo, importe el encabezado Swift generado y adopte el protocolo en una categoría privada. (El archivo de encabezado se nombra automáticamente):Este es el enfoque recomendado por 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
fuente
#import "AnalyticProtocol-Swift.h"
. Parece que WhateverProtocol-Swift.h no se genera automáticamente como dijiste.Si está creando un marco, la importación requerida
cambios a:
En este caso también debes hacer público el protocolo rápido :
fuente
Podemos usar protocolos rápidos en Objective C con pocos cambios en el código. Además, los protocolos declarados @objc le permiten tener métodos opcionales y obligatorios sin implementaciones predeterminadas. Viene con pros y contras.
De hecho, podríamos cambiar el nombre del protocolo a uno más descriptivo cuando lo usemos en Objective C. Hago uso de "@objc (alias_name)".
Aquí está el código. Tengamos un protocolo rápido con el atributo @objc y el nombre de alias para usar en el código de ObjC.
Ahora dejemos que farword declare nuestro protocolo en un archivo .h
Ahora puede ajustarse a este protocolo en el archivo .m y agregar la implementación de los métodos necesarios.
fuente