Как создать методы класса, которые соответствуют протоколу, совместно используемому Swift и Objective-C?

В последнее время я изучаю Swift.

Я решил написать гибридное приложение Swift / Objective-C, которое выполняло задачи с интенсивными вычислениями, используя один и тот же алгоритм, реализованный на обоих языках.

Программа рассчитывает большой массив простых чисел.

Я определил протокол, которому должны соответствовать и версия Swift, и версия Objective C объекта вычисления.

Оба объекта являются синглетонами, поэтому я создал типовой метод одноэлементного доступа в Objective-C:

+ (NSObject <CalcPrimesProtocol> *) sharedInstance;

Весь протокол выглядит так:

#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

Версия класса Objective-C реализует методы точно так, как определено выше, не беспокойтесь.

У быстрой версии есть метод:

  class func sharedInstance() -> CalcPrimesProtocol

Однако, если я сделаю этот метод обязательным методом протокола, я получу сообщение об ошибке компилятора «Type» CalcPrimesSwift не соответствует протоколу «CalcPrimesProtocol».

Однако, если я отмечу метод синглтон-класса sharedInstance как необязательный в протоколе, он работает, и я могу вызвать этот метод либо в моем классе Swift, либо в моем классе Objective-C.

Я пропустил некоторые тонкости в определении моего метода класса Swift? Это кажется маловероятным, учитывая, что я могу вызывать метод класса sharedInstance () для моего класса Swift или класса Objective-C.

Вы можете скачать проект с Github и проверить его, если хотите. Это называетсяSwiftPerformanceBenchmark, (ссылка на сайт)