c - 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
或类似标准枚举的东西。有办法吗?
解决方案
C 枚举被导入到 Swift 中,enum
如果它们是通过NS_ENUM
orCF_ENUM
宏定义的,请参见示例How to import c enum in swift。
CF_ENUM
是CFAvailability.h
从 Core Foundation 框架中定义的,因此如果尚未通过其他 Core Foundation 包含文件间接导入该文件,则必须导入该文件:
#include <CoreFoundation/CFAvailability.h>
typedef CF_ENUM(int, Foo) {
A = 0,
B = 1
};
如果您查找CF_ENUM
then 的定义,您会看到它是根据 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 处理未来枚举案例。)
推荐阅读
- r - 使用 gsub 替换 R 中最后出现的字符串
- c# - 了解 C# 属性
- react-native - 没有互联网时 React Native webview
- azure - Azure 文本到语音 API - 仅限 10 分钟的音频?
- c# - C#中的浮点解析
- c++ - OpenGL渲染黑色方块
- python - 使用 Raspberry Pi 3 在 Docker 上安装 TensorFlow
- codefluent - 可以从集合对象中调用不返回数据的 Raw SQL 方法吗?
- python - 如何修复 TensorFlow 对象检测示例中 version.py 导致的错误
- angular - 如何创建具有角度 4 或更多复选框的动态过滤器?