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)

questionAnswers(1)

yourAnswerToTheQuestion