Swift - C API перечисление в Swift - PullRequest
1 голос
/ 06 марта 2020

У меня C API определен так:

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

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

Как я могу напрямую использовать Foo enum в Swift? Я знаю, что могу делать var data: Foo = A, но мне не нравится этот синтаксис, где A кажется некоторой глобальной переменной.

Я бы предпочел var data: Foo = Foo.A или что-то похожее со стандартными перечислениями. Есть ли способ?

1 Ответ

2 голосов
/ 06 марта 2020
Перечисления

C импортируются в Swift как enum, если они определены с помощью макроса NS_ENUM или CF_ENUM, см., Например, Как импортировать c перечисление в swift .

CF_ENUM определяется в CFAvailability.h из платформы Core Foundation, поэтому вам необходимо импортировать этот файл, если он еще не был импортирован косвенно через другие включаемые файлы Core Foundation:

#include <CoreFoundation/CFAvailability.h>

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

Если вы посмотрите определение CF_ENUM, то увидите, что оно определено в терминах атрибута Clang enum_extensibility и расширяется до

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

Оба объявления импортируется в Swift как

public enum Foo : Int32 {
    case A
    case B
}

, и последняя версия не нуждается в дополнительных подключаемых файлах.

(Различие между «открытыми» и «закрытыми» перечислениями см. SE 0192 Обработка будущих случаев перечисления .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...