2015-05-26 10 views
5

Seit Swift 1.2 ist es möglich, enums in Swift automatisch in Objective-C umzuwandeln. Soweit ich das beurteilen kann, ist es jedoch nicht möglich, ein Array von Enums zu konvertieren. Ist das wahr?Überbrückung einer Reihe von Enums von Swift nach Objective-C

Also, das ist möglich:

@objc public enum SomeEnumType: Int { 
    case OneCase 
    case AnotherCase 
} 

Aber das ist nicht:

public func someFunc(someArrayOfEnums: Array<SomeEnumType>) -> Bool { 
    return true 
} 

Kann das jemand bestätigen? Und wie würdest du das empfehlen? Ein Ansatz wäre, zwei Methodendeklarationen zu haben, z.B.

Aber dies verschmutzt die Swift-Schnittstelle. Eine Möglichkeit, die zweite Funktionsdeklaration für Swift-Konsumenten zu verbergen?

+1

wahrscheinlich, weil Sie nicht eine Reihe von Aufzählungen haben können, in Ziel c Sie nur eine Reihe von NSNumber haben können. Int auf der anderen Seite kann leicht zu NSNumber –

Antwort

9

Es scheint, können wir nicht Array<SomeEnumType> Parameter Obj-C aussetzen, selbst wenn SomeEnumType ist @objc .

Als Abhilfe kann, wie etwa:

@objc(someFunc:) 
func objc_someFunc(someArrayOfEnums: Array<Int>) -> Bool { 
    return someFunc(someArrayOfEnums.map({ SomeEnumType(rawValue: $0)! })) 
} 

func someFunc(someArrayOfEnums: Array<SomeEnumType>) -> Bool { 
    return true 
} 
+0

Ah, ich wusste nicht, dass Sie die Methodennamen für objc nur mit '@ objc' angeben können. Ziemlich cool! Es ist immer noch nervig, aber das ist definitiv besser. –

-1

Leider kann eine Enum nicht von Objective-C auf Swift übertragen werden, es muss ein NS_ENUM sein. Ich hatte ähnliche Erfahrungen mit dir. Die Problemumgehung, die ich getan habe, war, eine Objective-C-Kategorie zu erstellen, die eine NS_ENUM enthält, und dort übertrage ich die Werte von der Framework-Enumeration auf meine eigene NS_ENUM.

Importieren Sie die Kategorie in Ihre Bridging-Header und Sie sollten in der Lage sein, die Enumeration zu verwenden, wie Sie normalerweise tun würden.

Etwas wie folgt aus:

typedef NS_ENUM(NSUInteger, ConnectionStatus) { 
    ConnectionStatusIdle 
} 

- (ConnectionStatus)connectionStatus { 
    if [self getConnectionStatus] == WF_SENSOR_CONNECTION_STATUS_IDLE { 
     return ConnectionStatusIdle 
    } 
} 

Dann sollten Sie in der Lage sein, es wie folgt zu verwenden:

switch myObject.connectionStatus() { 
    case .Idle: 
     // do something 
     break 
} 
+0

überbrückt werden Ich frage, ob es möglich ist, ein Array von Enums zu überbrücken, die in Swift zu Objective-C definiert sind. Und wenn nicht, was könnte ein eleganter Workaround sein. –