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



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

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

枚举是 JTTableViewCellEditState。它的实现与委托方法位于同一头文件中。具体如下:

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

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

if state == JTTableViewCellEditingState.Left {

"JTTableViewCellEditState.Type"没有名为"Left"的成员

试图用旧的Objective-C方式来做这件事,就像某种农民一样,给了我一个不同的,更意想不到的错误:

if state == JTTableViewCellEditingStateLeft {

无法使用类型为"(JTTableViewCellEditState, JTTableViewCellEditState, JTTableViewCellEditState)"的参数列表调用"=="

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

这种类型的

枚举降级会导致 swift 出现问题。我也有类似的问题。我的解决方案是创建一个辅助程序 objective-c 方法,该方法进行比较并在需要 == 时在 swift 中使用该方法。

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

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

你可以改用NS_ENUM吗?然后尝试JTTableViewCellEditingState.JTTableViewCellEditingStateLeft甚至.JTTableViewCellEditingStateLeft访问您的枚举。如果您无法将其更改为 NS_ENUM ,请查看在 swift

>

在我的环境中 - Xcode 版本 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 {
        // ...
    }
}

最新更新