Como criar métodos de classe que estão em conformidade com um protocolo compartilhado entre Swift e Objective-C?
Eu tenho aprendido Swift ultimamente.
Decidi escrever um aplicativo híbrido Swift / Objective-C que realizava tarefas de computação intensiva usando o mesmo algoritmo implementado nos dois idiomas.
O programa calcula uma grande variedade de números primos.
Eu defini um protocolo com o qual as versões Swift e Objective-C do objeto de cálculo devem estar em conformidade.
Os objetos são dois singletons, então criei um método típico de acesso singleton no Objective-C:
+ (NSObject <CalcPrimesProtocol> *) sharedInstance;
Todo o protocolo é assim:
#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
A versão Objective-C da classe implementa os métodos exatamente como definido acima, não se preocupe.
A versão rápida tem um método:
class func sharedInstance() -> CalcPrimesProtocol
No entanto, se eu tornar esse método um método obrigatório do protocolo, recebo um erro do compilador "Tipo" CalcPrimesSwift não está em conformidade com o protocolo 'CalcPrimesProtocol'.
Se eu marcar o método da classe singleton sharedInstance como opcional no protocolo, no entanto, ele funcionará e eu posso invocar esse método na minha classe Swift ou na minha classe Objective-C.
Perdi alguma sutileza na definição do meu método de classe Swift? Parece improvável, já que sou capaz de invocar o método da classe sharedInstance () na minha classe Swift ou na minha classe Objective-C.
Você pode fazer o download do projeto no Github e conferir, se desejar. É chamadoSwiftPerformanceBenchmark. (ligação)