Ich habe ein Ziel-C-Singleton wie folgt:
%Vor%Was an mehreren Stellen im GUI-Code aufgerufen wird:
%Vor%Und deshalb wird das Modell als eine Folge von demjenigen Teil der GUI erzeugt, der es zuerst referenziert.
Ich bin mir nicht sicher, wie das Äquivalent des Zugriffs auf die Klasse über [[MyModel model] someMethod] in Swift implementiert werden soll, da alle Beispiele für die Verwendung von Swift das Erstellen eines Objekts unter Verwendung eines Initialisierers und beim Konvertieren von Objective C-Klassenmethoden umfassen Swift Initialisierer Code gibt es ein Problem damit nicht funktioniert, wenn die Methode keine Parameter hat.
AKTUALISIEREN ++++++++++
Die unten beschriebene Problemumgehung ist nur erforderlich, wenn Sie Ihre Singleton-Methode mit einem Namen benennen, der vom Suffix des Klassennamens abgeleitet ist, d. h. die OPs stellen in Frage, dass der Methodenname ein Modell ist und die Klasse MyModel heißt.
Wenn die Methode in Singleton umbenannt wird, ist es möglich, sie wie folgt von Swift aus aufzurufen:
%Vor%+++++++++++
Ich weiß nicht, ob das gut / schlecht ist, aber ich konnte das Problem umgehen, dass die Initialisierung nicht funktioniert, wenn keine Parameter vorhanden sind, indem ich eine Dummy-Init-Methode hinzufüge. Verwenden Sie den Code der anderen Antwort als Beispiel:
%Vor%Mit diesem Code oben wird die Ding-Methode nicht aufgerufen, sondern das thingWithFoo: bar: method is.
Aber wenn es zu diesem geändert wird, dann wird jetzt die Ding-Methode aufgerufen:
%Vor%Wenn der Swift-Compiler fälschlicherweise eine Methode als Klassenfactory-Methode identifiziert, können Sie den Makro NS_SWIFT_NAME verwenden und die Swift-Signatur der Methode übergeben, damit sie korrekt importiert wird. Zum Beispiel:
%Vor%Also, deine Methode sollte das sein:
%Vor%Machen Sie genau das, was die Compiler-Warnung Ihnen sagt:
%Vor%Lesen Sie weiter, um zu sehen, warum ...
Swift erkennt automatisch ObjC-Konventionen für Initialisierer und Konstrukteure. Wenn Sie eine Klasse haben, die wie folgt aussieht:
%Vor% ... dann, wenn Swift sie in Initialisierer umwandelt, wird der Teil des Methodennamens, der der generische Name der Klasse ist ( Thing
/ thing
), verschoben, der Teil des Selektors, der sich auf die bezieht Parameter ist eine Parameterbezeichnung und löscht alle Präpositionen, die diese Teile verbinden. So sehen die Initialisierungsdeklarationen in Swift so aus:
und Sie konstruieren Objekte wie folgt:
%Vor% A followup: Da Klassenmethoden wie +[XYZThing thing]
vom ObjC wie Swift-Übersetzer wie Initialisierer behandelt werden (auch wenn das im Moment nicht vollständig zu funktionieren scheint), ist dieses Benennungsmuster für Singletons eine schlechte Idee. Eine Singleton-Abrufmethode sollte kein Initialisierer sein, da ein Initialisierer immer eine neue Instanz erstellt.
Eine Singleton-Abrufmethode sollte stattdessen einen Namen haben, der nicht mit dem generischen Namen der Klasse beginnt; z.B. +sharedThing
, +defaultThing
, +oneThingToRuleThemAll
, usw.
Tags und Links objective-c swift