在Swift中访问objective-C的NS_ENUM

时间:2016-07-14 06:12:37

标签: objective-c swift

我将此NS_ENUM称为ObserveType,其中包含两个名为ObserveObserveAll的属性。我可以访问ObserveAll属性,如图所示,但我无法访问Observe

NS_ENUM位于objective-C的头文件中。

我知道将Observe更改为ObserveXObserveXYZ会有效。

但如何在不更改Observe的名称的情况下访问Observe

注意我必须访问Swift上的Observe

enter image description here

3 个答案:

答案 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
}

您可以尝试使用其rawValue0)来访问无名案例,但如果可能,我建议您更新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

Apple Developer: Renaming Objective-C APIs for Swift