将Swift中的枚举数组桥接到Objective-C

从Swift 1.2开始,可以自动将Swift中的枚举转换为Objective-C。 但是,据我所知,这是不可能的转换一组枚举。 这是真的?

所以,这是可能的:

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

但是这不是:

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

任何人都可以validation此? 你会如何推荐解决这个问题? 一种方法是有两个方法声明,例如:

 // This will not automatically get bridged. public func someFunc(someArrayOfEnums: Array<SomeEnumType>) -> Bool { return true } // This will automatically get bridged. public func someFunc(someArrayOfEnums: Array<Int>) -> Bool { return true } 

但是这是污染Swift界面。 任何方式来隐藏任何Swift使用者的第二个函数声明?

看来,即使SomeEnumType@objc ,我们也不Array<SomeEnumType>参数暴露给Obj-C。

作为一种解决方法,如何:

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

不幸的是,一个枚举不能从Objective-C转换到Swift,它需要是一个NS_ENUM。 我对你有类似的经历。 我所做的解决方法是创build一个包含NS_ENUM的Objective-C类别,并将值从框架枚举传递给我自己的NS_ENUM。

导入桥接头中的类别,您应该可以像平常一样使用枚举。

像这样的东西:

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

那么你应该可以像这样使用它:

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