Создать Swift-интерфейс из Objective-C Заголовок из командной строки

В Xcode для любого заголовка Objective-C мы можем просмотреть Generated Interface, который показывает, как это видно Swift в interop.

Я хотел бы сгенерировать это из командной строки . Любая идея, как это сделать?

Бонусная задача: сначала заголовок должен быть предварительно скомпилирован, поэтому все #import должны быть заменены уже.

Ответы

Ответ 1

Вызвать команду интерпретатора :type lookup в модуль, который вы пытаетесь проверить.

Предположим, что у вас есть файл заголовка с именем header.h. Поместите его в отдельный каталог, чтобы интерпретатор распознал его как модуль. Также создайте модуль в том же каталоге. Позвоните в этот каталог Mod:

./
./Mod/
     /header.h
     /module.modulemap

Заполните модуль map следующим образом:

module Mod {
  header "./header.h"
  export *
}

Как только это будет сделано, выполните команду, подобную этой:

echo "import Mod\n:type lookup Mod" | swift -I./Mod | tail -n+2 >| generated-interface.swift

В качестве альтернативы вам может понадобиться использовать такую ​​команду с равным эффектом:

echo "import Mod\n:print_module Mod" | swift -deprecated-integrated-repl -I./Mod >| generated-interface.swift

Он разбивается следующим образом:

  • сначала мы эхо файл script, который должен быть выполнен: import module и type-lookup it;
  • тогда мы запускаем интерпретатор и загружаем script в него; аргумент -I помогает найти наш модуль, что имеет решающее значение;
  • то мы отключили часть "Добро пожаловать в Swift" с Tail
  • и записать результат в generated-interface.swift.

Во время выполнения указанных выше команд убедитесь, что ваш рабочий каталог установлен на один уровень выше, чем каталог Mod.

Обратите внимание, что вывод может быть не таким же, как у Xcode, но он очень похож.


Только для записи, если вы хотите создать интерфейс из файла Swift, тогда это просто:

swiftc -print-ast file.swift