Wie erstelle ich Klassenmethoden, die einem von Swift und Objective-C gemeinsam genutzten Protokoll entsprechen?
Ich habe in letzter Zeit Swift gelernt.
Ich habe beschlossen, eine hybride Swift / Objective-C-App zu schreiben, die rechenintensive Aufgaben mit demselben Algorithmus ausführt, der in beiden Sprachen implementiert ist.
Das Programm berechnet eine große Anzahl von Primzahlen.
Ich habe ein Protokoll definiert, dem sowohl die Swift- als auch die Objective-C-Version des Berechnungsobjekts entsprechen sollen.
Die Objekte sind beide Singletons, daher habe ich in Objective-C eine typische Singleton-Zugriffsmethode erstellt:
+ (NSObject <CalcPrimesProtocol> *) sharedInstance;
Das gesamte Protokoll sieht folgendermaßen aus:
#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
Die Objective-C-Version der Klasse implementiert die Methoden genau wie oben definiert, keine Sorge.
Die Swift-Version hat eine Methode:
class func sharedInstance() -> CalcPrimesProtocol
Wenn ich diese Methode jedoch zu einer erforderlichen Methode des Protokolls mache, wird der Compiler-Fehler "Typ" angezeigt. CalcPrimesSwift entspricht nicht dem Protokoll 'CalcPrimesProtocol'.
Wenn ich die Methode sharedInstance der Singleton-Klasse im Protokoll als optional markiere, funktioniert dies jedoch und ich kann diese Methode für meine Swift-Klasse oder meine Objective-C-Klasse aufrufen.
Habe ich bei der Definition meiner Swift-Klassenmethode einige Feinheiten übersehen? Es erscheint unwahrscheinlich, da ich die sharedInstance () - Klassenmethode für meine Swift-Klasse oder meine Objective-C-Klasse aufrufen kann.
Sie können das Projekt von Github herunterladen und bei Bedarf testen. Es heißt SwiftPerformanceBenchmark. (Verknüpfung