Objective-C枚举在Swift中无法识别

时间:2014-12-12 00:18:05

标签: objective-c xcode swift

我有一个委托方法,它将枚举作为参数传递:

func gestureRecognizer(gestureRecognizer: JTTableViewGestureRecognizer!, commitEditingState state: JTTableViewCellEditingState, forRowAtIndexPath indexPath: NSIndexPath!) -> Void {
    //....
}

枚举是JTTableViewCellEditingState。它的实现与委托方法在同一个头文件中。它如下:

typedef enum {
    JTTableViewCellEditingStateMiddle,
    JTTableViewCellEditingStateLeft,
    JTTableViewCellEditingStateRight,
} JTTableViewCellEditingState;

然而,试图引用一个状态,例如Left,会出错:

if state == JTTableViewCellEditingState.Left {
  

'JTTableViewCellEditingState.Type'没有名为'Left'的成员

尝试使用旧的Objective-C方式,就像某种农民一样,给了我一个不同的,更期望的错误:

if state == JTTableViewCellEditingStateLeft {
  

无法使用类型'(JTTableViewCellEditingState,JTTableViewCellEditingState)'的参数列表调用'=='

我想知道如何克服这个问题?我相信引用Objective-C枚举在过去运作得很好。

3 个答案:

答案 0 :(得分:3)

这种类型的enum decleration会迅速引发问题。我有类似的问题。我的解决方案是创建一个helper objective-c方法,在需要==时进行比较并在swift中使用该方法。

如果可以的话,其他解决方案可能会重构该代码并在objective-c中将其转换为正确的枚举。

typedef NS_ENUM(NSInteger, MyEnum) {
    MyEnumValue1,
    MyEnumValue2
}

答案 1 :(得分:2)

您可以使用NS_ENUM吗?然后尝试JTTableViewCellEditingState.JTTableViewCellEditingStateLeft甚至.JTTableViewCellEditingStateLeft来访问您的枚举。如果您无法将其更改为NS_ENUM,请查看Using non NS_ENUM objective-C enum in swift

答案 2 :(得分:2)

在我的环境中 - Xcode Version 6.1.1(6A2006):

typedef enum {
    JTTableViewCellEditingStateMiddle,
    JTTableViewCellEditingStateLeft,
    JTTableViewCellEditingStateRight,
} JTTableViewCellEditingState;

导出为Swift:

struct JTTableViewCellEditingState {
    init(_ value: UInt32)
    var value: UInt32
}
var JTTableViewCellEditingStateMiddle: JTTableViewCellEditingState { get }
var JTTableViewCellEditingStateLeft: JTTableViewCellEditingState { get }
var JTTableViewCellEditingStateRight: JTTableViewCellEditingState { get }

所以,这应该有效:

func gestureRecognizer(gestureRecognizer: JTTableViewGestureRecognizer!, commitEditingState state: JTTableViewCellEditingState, forRowAtIndexPath indexPath: NSIndexPath!) -> Void {
    if state.value == JTTableViewCellEditingStateLeft.value {
        // ...
    }
}