Ich versuche, einen Teil meiner Obj-C-Klasse in Swift umzuwandeln. Und einige andere Obj-C-Klassen verwenden immer noch Enum in dieser konvertierten Klasse. Ich habe in den Pre-Release-Dokumenten gesucht und konnte es nicht finden oder habe es verpasst. Gibt es eine Möglichkeit, Swift enum in der Obj-C-Klasse zu verwenden? Oder ein Link zum Dokument dieser Ausgabe?
So habe ich meine Aufzählung in meinem alten Obj-C-Code und meinem neuen Swift-Code deklariert.
mein alter Obj-C Code:
typedef NS_ENUM(NSInteger, SomeEnum)
{
SomeEnumA,
SomeEnumB,
SomeEnumC
};
@interface SomeClass : NSObject
...
@end
Mein neuer Swift Code:
enum SomeEnum: NSInteger
{
case A
case B
case C
};
class SomeClass: NSObject
{
...
}
Update: Aus den Antworten. Dies ist in einer älteren Swift-Version als 1.2 nicht möglich. Aber laut diesem offiziellen Swift Blog . In Swift 1.2 , dass mit XCode 6.3 freigegeben entlang, können Sie Swift Enum verwenden in Objective-C durch Zugabe @objc
vorenum
quelle
Antworten:
Ab Swift Version 1.2 (Xcode 6.3) können Sie. Stellen Sie der Enum-Deklaration einfach das Präfix vor
@objc
Schamlos aus dem Swift Blog entnommen
In Objective-C würde dies so aussehen
quelle
BearBlack
,BearGrizzly
undBearPolar
!So erweitern Sie die ausgewählte Antwort ...
Es ist möglich, Swift-Enums zwischen Swift und Objective-C zu teilen
NS_ENUM()
.Sie müssen nur in einem Objective-C-Kontext mit definiert werden
NS_ENUM()
und werden mit der Swift-Punktnotation verfügbar gemacht.Aus der Verwendung von Swift mit Kakao und Objective-C
Ziel c
Schnell
quelle
if let a = MyEnum(rawValue: 12345)
12345, das nicht Teil dieser Aufzählung ist, ist das Ergebnis keine optionale, sondern eine ungültige Aufzählung.Aus dem Handbuch Verwenden von Swift mit Kakao und Objective-C :
Nein, Sie können keine Swift-Enumeration in einer Objective-C-Klasse verwenden.
quelle
@objc
wie in seiner Antwort unten unter @DanielGalasko angegeben !!!@obj enum MyEnum: Int
funktioniert dies wie zuvor erwähnt für Objective-C-Dateien einwandfrei. Wenn Ihre Aufzählung mit einem anderen@obj enum MyOtherEnum: String
Swift 4.1, Xcode 9.4.1:
1) Swift enum muss vorangestellt werden
@objc
und vomInt
Typ:2) Ziel-C-Name ist Aufzählungsname + Fallname, z
CalendarPermissionAuthorized
.Denken Sie natürlich daran, Ihren Swift-Bridging-Header als letztes Element in der Importliste der Objective-C-Datei zu importieren:
quelle
Wenn Sie die ObjC-Codes lieber unverändert lassen möchten, können Sie Ihrem Projekt eine Hilfskopfdatei hinzufügen:
Fügen Sie in der Header-Datei diesen Aufzählungstyp hinzu:
Möglicherweise befindet sich in Ihrer .m-Datei ein anderer Ort, an dem Sie Änderungen vornehmen können: um die versteckte Header-Datei einzuschließen:
Ersetzen Sie [YourProjectName] durch Ihren Projektnamen. Diese Header-Datei macht alle von Swift definierten @ objc-Klassen und Aufzählungen für ObjC verfügbar.
Möglicherweise erhalten Sie eine Warnmeldung zur impliziten Konvertierung vom Aufzählungstyp ... Es ist in Ordnung.
Übrigens können Sie diese Header-Hilfsdatei verwenden, um einige ObjC-Codes wie #define-Konstanten beizubehalten.
quelle
Wenn Sie (wie ich) wirklich String-Aufzählungen verwenden möchten, können Sie eine spezielle Schnittstelle für Objective-C erstellen. Beispielsweise:
Dies bietet Ihnen natürlich nicht die Möglichkeit, automatisch zu vervollständigen (es sei denn, Sie definieren zusätzliche Konstanten in der Objective-C-Umgebung).
quelle
das könnte ein bisschen mehr helfen
Problemstellung : - Ich habe eine Aufzählung in der Swift-Klasse, auf die ich von anderen Swift-Klassen aus zugreife, und jetzt muss ich von meiner Zielklasse C darauf zugreifen.
Bevor Sie von der Ziel-C-Klasse darauf zugreifen: -
Änderungen für den Zugriff von der Zielklasse c
und fügen Sie eine Funktion hinzu, um sie an den Wert weiterzugeben
quelle
Nachdem ich dies untersucht hatte, fand ich immer wieder nur teilweise Antworten. Daher erstellte ich ein vollständiges Beispiel für eine Swift-App, die mit Objective C verbunden ist und Swift-Aufzählungen enthält, die von Objective C-Code und Objective C-Aufzählungen verwendet werden, die von Swift-Code verwendet werden. Es ist ein einfaches Xcode-Projekt, mit dem Sie experimentieren können. Es wurde mit Xcode 10.3 mit Swift 5.0 geschrieben
Beispielprojekt
quelle
enum SwAnimal
fehlt die führende@obj
Falls Sie versuchen, eine Aufzählung zu beobachten, die folgendermaßen aussieht:
Diese Problemumgehung hat mir geholfen.
Beobachtbare Klasse:
@objc dynamic var observable: String?
Erstellen Sie Ihre Enum-Instanz folgendermaßen:
Beobachterklasse:
private var _enumName: EnumName?
private let _instance = ObservableClass()
erstellen
Dann ist es soweit. Jedes Mal, wenn Sie die
_enumName
in der beobachtbaren Klasse ändern , wird auch eine entsprechende Instanz in der Beobachterklasse sofort aktualisiert.Dies ist natürlich eine stark vereinfachte Implementierung, sollte Ihnen jedoch eine Vorstellung davon geben, wie Sie KVO-inkompatible Eigenschaften beobachten können.
quelle