Swift-Fehler: Klassenmethode "someMethod () ist nicht verfügbar, benutze Objektkonstruktion Class ()"

8

Objective-C-APIs erstellen eine Menge von Objekten mit Klassenmethoden:

%Vor%

Manchmal sehe ich sogar, dass diese in alten Swift-Tutorials als Klassenmethoden erscheinen, aber wenn ich versuche, sie aufzurufen, erhalte ich Compilerfehler wie diese:

  

date() ist nicht verfügbar, verwenden Sie die Objektkonstruktion NSDate()

     

urlWithString() ist nicht verfügbar, verwenden Sie die Objektkonstruktion NSURL(string:)

     

layerWithSession() ist nicht verfügbar, verwenden Sie die Objektkonstruktion AVCaptureVideoPreviewLayer(session:)

(Ich sehe Deklarationen wie convenience init(URL url: NSURL) in den Dokumenten und in den von Xcode generierten Swift-Interfaces für SDK-Klassen, aber was haben sie damit zu tun?)

Das passiert sogar, wenn ich Klassenmethoden wie in einem Singleton-Muster in meinem eigenen ObjC-Code deklariere:

%Vor%

Wenn ich versuche, sie von Swift zu verwenden, bekomme ich die gleichen Fehler:

%Vor%

Was gibt? Wie behebe ich diese Fehler?

    
rickster 25.01.2016, 23:51
quelle

1 Antwort

13

Swift verzichtet auf das Initialisierungsmuster alloc / init von Objective-C und ersetzt es durch eine ähnliche Konstruktionssyntax wie in Java oder C ++.

Wenn Sie in einer Swift-Klasse-Oberfläche (oder in der Apple-Dokumentation) etwas wie folgt sehen:

%Vor%

Das bedeutet, dass Sie ein Thing erstellen können, indem Sie es mit der folgenden "Konstruktionssyntax" aufrufen:

%Vor%

Es spielt keine Rolle, ob es ein class oder ein struct ist, oder wenn Sie andere Dinge wie convenience oder required oder public vor init sehen ... so verwenden Sie es . (Ersetzen Sie natürlich Thing durch den von Ihnen verwendeten Typ, number durch beliebige Parameterbezeichnungen im gewünschten Initializer und 2 durch einen geeigneten Wert für diesen Parameter.)

Wenn Klassen, die ursprünglich in ObjC definiert wurden, in Swift importiert werden, macht der Swift-Compiler eine Menge Dinge, damit diese APIs mehr wie nativer Swift-Code aussehen und sich anfühlen. Eines dieser Dinge ist, das übliche Muster der Verwendung von Klassenmethoden als Convenience-Konstruktoren mit echten Initializern zu ersetzen.

Alle Beispiele aus der Frage:

%Vor%

... sind solche Konstrukteure der Bequemlichkeit. Das heißt, sie importieren in Swift nicht als Klassenmethoden ( NSDate.date() , NSURL.urlWithString() , etc), sondern als Initialisierer:

%Vor%

... und Sie rufen sie mit der Syntax der Objektkonstruktion auf:

%Vor%

Wenn Fehlermeldungen zu "ist nicht verfügbar, verwenden Sie Objektkonstruktion" angezeigt wird, bietet Xcode praktisch immer eine automatische Korrektur, um die richtige Syntax einzufügen.

Wie funktioniert das? Swift sucht nach möglichen "Basisnamen" einer Klasse und passt zwischen diesen Namen und den Namen der Klassenmethode / Initialisierungsmethode. (Es prüft auch nach Klassenmethoden, die eine Instanz dieser Klasse zurückgeben, Initialisierer, die mit "init ..." beginnen, usw.).

Swift sieht zum Beispiel Folgendes als einen Convenience-Konstruktor:

%Vor%

Dies kann ein Problem sein, wenn Sie (oder der ursprüngliche Entwickler von PDQMediaManager ) beabsichtigen, dass diese Klasse als Singleton und die +manager -Methode die Singleton-Instanz zurückgibt - wenn ein Swift-Entwickler% schreibt co_de%, sie werden eine neue Instanz erstellen, anstatt das Singleton abzurufen.

In diesem Fall ist es eine gute Lösung, die Singleton-Methode umzubenennen:

%Vor%

Dies wird nicht als Convenience-Konstruktor angesehen, daher können Swift-Clients PDQMediaManager() aufrufen, um die Singleton-Instanz zu erhalten.

Sie können auch die PDQMediaManager.defaultManager() verwenden, um die Singleton-Methode nur für Swift-Clients umzubenennen:

%Vor%

Wenn Sie die Codebase nicht mit der problematischen Methode steuern, ist es wahrscheinlich am besten, Ihren eigenen ObjC-Code zu schreiben, um ihn an die Singleton-Methode weiterzuleiten und diesen über einen Bridging-Header Ihrem Swift-Code zugänglich zu machen.

    
rickster 26.01.2016 04:25
quelle

Tags und Links