Ich bin nicht sicher, was genau Ihr Anwendungsfall ist, aber hier ist ein kurzes Beispiel, wie eine in Objective-C definierte Enum in einer Swift-Klasse verwendet werden kann, die wiederum in Objective-C verwendet werden kann. Hier
sind die Objective-C-Header (oclib.h
):
#ifndef oclib_h
#define oclib_h
#import <Foundation/Foundation.h>
typedef enum {A, B, C} oc_enum_t;
void useSwiftClassInC();
#endif /* oclib_h */
Hier ist die entsprechende Objective-C .m
Datei (oclib.m
):
#import "oclib.h"
#import "swift_c_1-Swift.h" // Need this to have access to Swift types; the swift_c_1 part will be your product module name.
void useSwiftClassInC() {
UseEnum *ue = [[UseEnum alloc] initWithE:B i:444];
printf("In Objective-C useSwiftClassInC(): m_Enum = %d, m_Int = %d\n", ue.m_Enum, ue.m_Int);
ue.m_Enum = A;
ue.m_Int = 10;
[UseEnum printUseEnum: ue];
}
Und hier ist die Swift-Datei:
// Swift class that uses an enum from Objective-C
class UseEnum : NSObject // NSObject inheritance is important!
{
var m_Enum : oc_enum_t
var m_Int : Int32
init(e : oc_enum_t, i : Int32)
{
m_Enum = e
m_Int = i
}
static func printUseEnum(x : UseEnum)
{
print("In Swift UseEnum::printUserEnum: m_Enum = \(x.m_Enum), m_Int = \(x.m_Int)")
}
}
// This calls an Objective-C function that does the following:
// - creates a UseEnum object
// - prints it out from Objective-C
// - modifies it
// - calls printUseEnum(), implemented in Swift, to print the object
useSwiftClassInC()
Der überbrückende Header hat nur
#import "oclib.h"
Sie haben wahrscheinlich diese Dokumentation bereits gesehen, aber wenn nicht, hier ist es: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
Bitte mehr Details über Ihre spezifische Situation geben, wenn dies Ihre Frage nicht beantworten. Hier ist die Ausgabe I aus dem Beispiel erhalten:
In Objective-C useSwiftClassInC(): m_Enum = 1, m_Int = 444
In Swift UseEnum::printUserEnum: m_Enum = oc_enum_t(rawValue: 0), m_Int = 10
Eine interessante Situation ergibt sich, wenn ein Datentyp in Swift definiert ist, in der Unterzeichnung einer Objective-C-Funktion verwendet, die von Swift aufgerufen werden muss. Xcode wird uns das *-Swift.h
in einem Objective-C-Header oder einem Bridging-Header nicht importieren. Eine Lösung besteht darin, die Forward-Deklaration des Swift-Typs @class
zu verwenden. Wenn also im obigen Beispiel wir eine Objective-C-Funktion benötigt, die UseEnum
als Parameter annimmt, könnten wir so etwas wie dies in oclib.h
haben:
...
@class UseEnum; // Forward declaration must come before UseEnum is used!
...
void useSwiftClassInC_1(UseEnum * useEnum);
...
wenn es Enum ein Objective-C ist nur sicher, es ist 'typedef' ed als ein ['NS_ENUM'] (http://stackoverflow.com/a/25078514/332733) – Mgetz
Mögliches Duplikat von [Swift und Vergleichen von C typedef enums] (http://stackoverflow.com/questions/24872475/swift -und-Vergleichen-c-typedef-enums) – Mgetz