首页 > 解决方案 > Swift - Swift 中的 C API 枚举

问题描述

我有这样定义的 C API:

typedef enum Foo {
   A = 0,
   B = 1
} Foo;

typedef struct Bar {
  int a;
  Foo foo;
} Bar;

如何Foo直接在 Swift 中使用枚举?我知道,我可以做到var data: Foo = A,但我不喜欢这种语法,其中A似乎是一些全局变量。

我宁愿拥有var data: Foo = Foo.A或类似标准枚举的东西。有办法吗?

标签: cswiftenums

解决方案


C 枚举被导入到 Swift 中,enum如果它们是通过NS_ENUMorCF_ENUM宏定义的,请参见示例How to import c enum in swift

CF_ENUMCFAvailability.h从 Core Foundation 框架中定义的,因此如果尚未通过其他 Core Foundation 包含文件间接导入该文件,则必须导入该文件:

#include <CoreFoundation/CFAvailability.h>

typedef CF_ENUM(int, Foo) {
    A = 0,
    B = 1
};

如果您查找CF_ENUMthen 的定义,您会看到它是根据 Clangenum_extensibility属性定义的,并扩展为

typedef enum __attribute__((enum_extensibility(open))) : int {
    A = 0,
    B = 1
} Foo;

两个声明都被导入到 Swift

public enum Foo : Int32 {
    case A
    case B
}

并且后一个版本不需要额外的包含文件。

(有关“开放”和“封闭”枚举之间的区别,请参阅SE 0192 处理未来枚举案例。)


推荐阅读