¿Cómo crear métodos de clase que se ajusten a un protocolo compartido entre Swift y Objective-C?
He estado aprendiendo Swift últimamente.
Decidí escribir una aplicación híbrida Swift / Objective-C que hiciera tareas intensivas en cómputo usando el mismo algoritmo implementado en ambos idiomas.
El programa calcula una gran variedad de números primos.
Definí un protocolo que se supone que deben cumplir tanto la versión Swift como la versión Objective-C del objeto de cálculo.
Los objetos son singletons, así que creé un método de acceso singleton típico en Objective-C:
+ (NSObject <CalcPrimesProtocol> *) sharedInstance;
Todo el protocolo se ve así:
#import <Foundation/Foundation.h>
@class ComputeRecord;
typedef void (^updateDisplayBlock)(void);
typedef void (^calcPrimesCompletionBlock)(void);
@protocol CalcPrimesProtocol <NSObject>
- (void) calcPrimesWithComputeRecord: (ComputeRecord *) aComputeRecord
withUpdateDisplayBlock: (updateDisplayBlock) theUpdateDisplayBlock
andCompletionBlock: (calcPrimesCompletionBlock) theCalcPrimesCompletionBlock;
@optional //Without this @optional line, the build fails.
+ (NSObject <CalcPrimesProtocol> *) sharedInstance;
@end
La versión Objective-C de la clase implementa los métodos exactamente como se definieron anteriormente, no se preocupe.
La versión rápida tiene un método:
class func sharedInstance() -> CalcPrimesProtocol
Sin embargo, si convierto ese método en un método requerido del protocolo, me sale un error del compilador "Tipo" CalcPrimesSwift no se ajusta al protocolo 'CalcPrimesProtocol'.
Sin embargo, si marco el método de clase singleton sharedInstance como opcional en el protocolo, funciona, y puedo invocar ese método en mi clase Swift o en mi clase Objective-C.
¿Me perdí algo de sutileza en la definición de mi método de clase Swift? Parece poco probable, dado que puedo invocar el método de clase sharedInstance () en mi clase Swift o mi clase Objective-C.
Puede descargar el proyecto desde Github y verificarlo si lo desea. Se llamaSwiftPerformanceBenchmark. (enlazar)