2016-04-08 6 views
0

Ich habe eine Enum in Objective C definiert und als Datentyp in einem Swift-Objekt verwendet.Verwenden einer Ziel-C-Enum in Swift zurück in Objective C

Jetzt verwende ich dieses schnelle Objekt in Objective C und ich möchte auf die Eigenschaft zugreifen.

Die Eigenschaft wird jedoch nicht zur Datei "xxxx-Swift.h" in der Klasse hinzugefügt. Ich weiß, dass es möglich ist, Swift-Enums in Obj C mit @objc zu verwenden, bevor ich es anwende, aber ich habe nicht viel Kontrolle über dieses Enum, da es automatisch aus dem bestehenden Objective-C-Code generiert wird.

+0

wenn es Enum ein Objective-C ist nur sicher, es ist 'typedef' ed als ein ['NS_ENUM'] (http://stackoverflow.com/a/25078514/332733) – Mgetz

+0

Mögliches Duplikat von [Swift und Vergleichen von C typedef enums] (http://stackoverflow.com/questions/24872475/swift -und-Vergleichen-c-typedef-enums) – Mgetz

Antwort

1

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); 
... 
+0

Oh interessant, Sie haben eine Wrapper-Klasse. Hier ist mein Anwendungsfall: Es gibt also eine Objective-C-Bibliothek mit einer Enumeration. Nenne es ObjCLib. Diese objektive C-Bibliothek wird in einer Swift-Bibliothek verwendet. Nennen Sie es SwiftLib. Die Swift-Bibliothek verfügt über eine Einstellungsklasse mit einer Eigenschaft als Aufzählungstyp. Ich habe ein Projekt in Objective C geschrieben, das SwiftLib verwendet. Ich möchte den Wert einer enum-Eigenschaft in der settings-Klasse in SwiftLib festlegen, aber die Eigenschaft wird nicht wie alle anderen Eigenschaften zu SwiftLib-Swift.h hinzugefügt, da der Datentyp nicht mit Objective C kompatibel ist. – iseletsky

+0

Die Antwort wurde dahingehend erweitert, dass sie Vorwärtsdeklarationen enthält. Sie werden auch in den referenzierten Apple-Dokumenten beschrieben. Jetzt sollten Sie gut ausgerüstet sein. Alles Gute für dich. – OmniProg

Verwandte Themen