如何在Swift中使用Objective-C枚举

Mit*_*oto 36 swift

我在Objective-C文件和Swift文件中有2个枚举定义.

Japanese.h

typedef enum {
  JapaneseFoodType_Sushi = 1,
  JapaneseFoodType_Tempura = 2,
} JapaneseFoodType;
Run Code Online (Sandbox Code Playgroud)

US.swift

enum USFoodType {
  case HUMBERGER;
  case STEAK;
}
Run Code Online (Sandbox Code Playgroud)

我们知道,我可以像下面这样使用Objective-C枚举;

Japanese.m

- (void)method {
  JapaneseFoodType type1 = JapaneseFoodType_Sushi;
  JapaneseFoodType type2 = JapaneseFoodType_Tempura;
  if (type1 == type2) {// this is no problem
  }
}
Run Code Online (Sandbox Code Playgroud)

但我不能在Swift文件中使用Objective-C枚举,如下所示;

  func method() {
    var type1: USFoodType = USFoodType.HUMBERGER// no problem
    var type2: USFoodType = USFoodType.HUMBERGER// no problem
    if type1 == type2 {

    }

    var type3: JapaneseFoodType = JapaneseFoodType_Sushi// no problem
    var type4: JapaneseFoodType = JapaneseFoodType_Tempura// no problem
    if type3 == type4 {// 'JapaneseFoodType' is not convertible to 'Selector'

    }
  }
Run Code Online (Sandbox Code Playgroud)

这是Swift的错误吗?如何在Swift文件中使用Objective-C(C)枚举?

Sul*_*han 62

我认为这是一个错误,因为Swift应该定义==C枚举或"to Int"转换,但事实并非如此.

最简单的解决方法是将您的C enum重新定义为:

typedef NS_ENUM(NSUInteger, JapaneseFoodType) {
    JapaneseFoodType_Sushi = 1,
    JapaneseFoodType_Tempura = 2,
};
Run Code Online (Sandbox Code Playgroud)

这将允许LLVM处理枚举并将其转换为Swift枚举(NS_ENUM也改进了你的Obj-C代码!).

另一个选择是使用重新解释hack定义相等性:

public func ==(lhs: JapaneseFoodType, rhs: JapaneseFoodType) -> Bool {
    var leftValue: UInt32 = reinterpretCast(lhs)
    var rightValue: UInt32 = reinterpretCast(rhs)

    return (leftValue == rightValue)
}
Run Code Online (Sandbox Code Playgroud)


Nik*_*nov 20

您应该使用NS_ENUM宏来使您的枚举与Swift兼容.

另请注意,您的枚举文字应该被访问JapaneseFoodType._Sushi,因此删除下划线可能是个好主意.