Как создать методы класса, которые соответствуют протоколу, совместно используемому 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, (ссылка на сайт)