我在Objective-C文件和Swift文件中有2个枚举定义。
Japanese.h
typedef enum {
JapaneseFoodType_Sushi = 1,
JapaneseFoodType_Tempura = 2,
} JapaneseFoodType;
US.swift
enum USFoodType {
case HUMBERGER;
case STEAK;
}
我们知道,我可以使用Objective-C枚举,如下所示;
Japanese.m
- (void)method {
JapaneseFoodType type1 = JapaneseFoodType_Sushi;
JapaneseFoodType type2 = JapaneseFoodType_Tempura;
if (type1 == type2) {// this is no problem
}
}
但我不能在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'
}
}
这是Swift的错误吗?如何在Swift文件中使用Objective-C(C)枚举?
答案 0 :(得分:61)
我认为这是一个错误,因为Swift应该为C枚举或“to Int”转换定义==
,但它没有。
最简单的解决方法是将您的C enum重新定义为:
typedef NS_ENUM(NSUInteger, JapaneseFoodType) {
JapaneseFoodType_Sushi = 1,
JapaneseFoodType_Tempura = 2,
};
允许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)
}
答案 1 :(得分:17)
您应该使用NS_ENUM
宏来使您的枚举与Swift兼容。
另请注意,您的枚举文字应该像JapaneseFoodType._Sushi
一样访问,因此删除下划线可能是个好主意。