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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage