我将此NS_ENUM
称为ObserveType
,其中包含两个名为Observe
和ObserveAll
的属性。我可以访问ObserveAll
属性,如图所示,但我无法访问Observe
。
NS_ENUM位于objective-C的头文件中。
我知道将Observe
更改为ObserveX
或ObserveXYZ
会有效。
但如何在不更改Observe
的名称的情况下访问Observe
?
注意我必须访问Swift上的Observe
。
答案 0 :(得分:0)
来自Language Guide - Interoperability - Interacting with C APIs:
“C枚举案例名称的前缀在导入Swift时被删除,无论它们是在系统框架中定义还是 在自定义代码中。“
这意味着ObserveType
枚举中的第一个案例在导入Swift后没有名字(我有点惊讶不会产生编译错误)。如果我们打印转换,它看起来像(概念上)
typedef NS_ENUM(NSInteger, ObserveType) {
Observe = 0
ObserveAll = 1
};
// imported like ...
enum ObserveType: Int {
case _ = 0 // obviously illegal if applied directly in Swift
case All
}
您可以尝试使用其rawValue
(0
)来访问无名案例,但如果可能,我建议您更新Obj-C枚举中第一个案例的名称。
if let empty = ObserveType(rawValue: 0) {
print(empty) // prints ""?
}
答案 1 :(得分:0)
dfri 的答案很明显,并且为了扩展他的答案,最好根据广泛采用的惯例命名枚举及其案例。在下面的代码中,我对你的意图做了一些猜测。
typedef NS_ENUM(NSUInteger, XYZObserveType) {
XYZObserveOne,
XYZObserveAll
}
在处理包含Swift和Objective-C代码的项目时,我发现有用的另一个技巧是源编辑器中的 Generated Interface 。
当您查看Objective-C类时,选择此选项将显示生成的Swift标题,这在许多场合都会有所帮助。
答案 2 :(得分:0)
除了上述答案外,我想指出的是,您可以使用NS_SWIFT_NAME
宏为您的Objective-C NS_ENUM提供一个Swift名称:
typedef NS_ENUM(NSUInteger, XYZAwesomeEnum) {
XYZAwesomeEnumA,
XYZAwesomeEnumB,
XYZAwesomeEnumC,
} NS_SWIFT_NAME(AwesomeEnum);
稍后在Swift中使用它:
AwesomeEnum.a