2014-06-10 8 views
14

Ich arbeite mit dem Facebook Objective-C-SDK in Swift und ich versuche, einen FBSessionState-Wert mit einem Wert aus der Enumeration zu vergleichen. Ich erhalte jedoch den Compiler-Fehler:Gleichheit auf Objective-C typedef enum in Swift

Could not find an overload for '==' that accepts the supplied arguments

ich im Wesentlichen zu erreichen versuchen:

if state == FBSessionStateOpen { ... } 

ich in der Lage bin durch einen Vergleich mit dem Wert, um dieses Werk ...

if state.value == FBSessionStateOpen.value { ... } 

Aber ich frage mich, ob es eine Möglichkeit gibt, diese Arbeit mehr wie eine schnelle Enum zu machen?

+0

Versuchen 'wenn Zustand == .FBSessionStateOpen' – Adam

+2

Kein Glück, nach Swift docs diese gearbeitet haben sollte, aber es scheint, Die Enumeration wurde nicht mit dem Makro NS_ENUM erstellt. Der Fehler lautet: "FBSessionStateOpen" konnte nicht gefunden werden – DennyFerra

Antwort

9

Sie konnten die Enum und Konstanten mit ‚.value‘ auspacken die darunter liegende ganze Zahl zu erhalten, die schaltbar sein sollte:

switch x.value { 
    case Foo.value: 
} 

Vielleicht ein Bug und Apfel fix es in zukünftigen Versionen dieser ist.

-1

Swift ordnet Obj-C enums automatisch seiner eigenen Struktur enumName.caseName zu. Zum Beispiel, wenn der enum heißt FBSessionState und es ist der FBSessionStateOpen Fall, wird es als FBSessionState.Open in Swift.

Der Operator == funktioniert zum Vergleichen von Swift-Enums.

+1

Dies scheint bei FBSessionState nicht zu passieren. Die Verwendung von FBSessionState.Open oder FBSessionState.FBSessionStateOpen führt zu einem "Erwarteten Elementnamen oder Konstruktoraufruf nach Typname". Ich denke, das Enummapping erfolgt nur, wenn Enums mit dem NS_ENUM-Makro definiert sind, wie in den Dokumenten https://developer.apple angegeben. com/library/prerelease/ios/documentation/swift/konzeptuell/buildingcocoaapps/InteractingWithCAPIs.html # // apple_ref/doc/uid/TP40014216-CH8-XID_15 – DennyFerra

+0

@DennyFerra Ah, da hast du wahrscheinlich Recht. Da die meisten Obj-C-Enums nur ganzzahlige Werte sind, sollte es ziemlich einfach sein, sie in Swift neu zu erstellen und stattdessen einfach zu verwenden. – Erik

4

Mit dem Beta4-Update funktioniert die .value-Problemumgehung nicht mehr. Es scheint keine andere einfache Lösung zu geben, ohne das Facebook SDK zu ändern.

Ich habe alle Facebook-Enums geändert, um den NS_ENUM-Makro zu verwenden, so dass Sie Swift-Syntax die Enums verwenden können.

if FBSession.activeSession().state == .CreatedTokenLoaded 

wurden diese Veränderungen in pgaspar's Facebook fork verschmolzen, die andere Korrekturen für Swift Kompatibilität umfasst.

pod 'Facebook-iOS-SDK', :git => 'https://github.com/pgaspar/facebook-ios-sdk.git' 
+1

Irgendwelche Anhaltspunkte, warum Facebook dies noch nicht * beheben * muss? Es besteht die Gefahr, dass die Gabel von "Paspar" stockt, da Facebook weitere Veränderungen vornimmt. –

2

Nikolai Nagorny Antwort Hinzufügen, das ist was für mich gearbeitet:

if (device.deviceType.value == TYPE_BLUETOOTHNA.value)