我的 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或类似的标准枚举。有办法吗?
C 枚举被导入到 Swift 中,就像enum它们是通过NS_ENUM或CF_ENUM宏定义的一样,请参阅例如如何在 swift 中导入 c 枚举。
CF_ENUM是CFAvailability.h从 Core Foundation 框架中定义的,因此如果尚未通过其他 Core Foundation 包含文件间接导入该文件,则必须导入该文件:
#include <CoreFoundation/CFAvailability.h>\n\ntypedef CF_ENUM(int, Foo) {\n A = 0,\n B = 1\n};\nRun Code Online (Sandbox Code Playgroud)\n\n如果您查找 then 的定义,CF_ENUM您会发现它是根据 Clangenum_extensibility属性定义的,并扩展为
typedef enum __attribute__((enum_extensibility(open))) : int {\n A = 0,\n B = 1\n} Foo;\nRun Code Online (Sandbox Code Playgroud)\n\n两个声明都导入到 Swift 中:
\n\npublic enum Foo : Int32 {\n case A\n case B\n}\nRun Code Online (Sandbox Code Playgroud)\n\n并且后一个版本不需要额外的包含文件。
\n\n(有关 \xe2\x80\x9copen\xe2\x80\x9d 和 \xe2\x80\x9clated\xe2\x80\x9d 枚举之间的差异,请参阅SE 0192 处理未来的枚举情况。)
\n