Swift - Swift 中的 C API 枚举

Mar*_*rry 1 c enums swift

我的 C API 定义如下:

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

typedef struct Bar {
  int a;
  Foo foo;
} Bar;
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*n R 5

C 枚举被导入到 Swift 中,就像enum它们是通过NS_ENUMCF_ENUM宏定义的一样,请参阅例如如何在 swift 中导入 c 枚举

\n\n

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

\n\n
#include <CoreFoundation/CFAvailability.h>\n\ntypedef CF_ENUM(int, Foo) {\n    A = 0,\n    B = 1\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您查找 then 的定义,CF_ENUM您会发现它是根据 Clangenum_extensibility属性定义的,并扩展为

\n\n
typedef enum __attribute__((enum_extensibility(open))) : int {\n    A = 0,\n    B = 1\n} Foo;\n
Run Code Online (Sandbox Code Playgroud)\n\n

两个声明都导入到 Swift 中:

\n\n
public enum Foo : Int32 {\n    case A\n    case B\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

(有关 \xe2\x80\x9copen\xe2\x80\x9d 和 \xe2\x80\x9clated\xe2\x80\x9d 枚举之间的差异,请参阅SE 0192 处理未来的枚举情况。)

\n