Xcode 6/Beta 4: использование заголовков мостов с объектами инфраструктуры не поддерживается

Я только что обновился до Xcode 6 Beta 4 и создал фреймворк, который я создал для Live Views в бета-версии 2. Из-за другой быстрой ошибки, мне нужно было использовать некоторые Код Obj-C. Однако при обновлении я получаю следующую ошибку:

ошибка: использование мостов заголовков с объектами каркаса не поддерживается

Я ничего не видел в примечаниях к выпуску или нашел какой-либо другой путь миграции. Кто-нибудь еще видел это и пришел к решению?

Я понимаю, что Beta 3 устраняет необходимость в каркасах для живых просмотров, но имеет смысл в моем случае, если я могу заставить его работать. Я могу удалить его, хотя в качестве резервного, но предпочел бы использовать фреймворк, если он не полностью нарушен в бета-версии 4.

Ответ 1

Как говорится в ошибке, мосты-заголовки не допускаются в Framework. Раздел Импорт кода изнутри той же рамки раздела Mix and Match. Как говорится, вам нужно "В вашем заголовочном файле вашего зонтика импортировать каждый заголовок Objective-C, который вы хотите открыть для Swift".

Однако я обнаружил, что вам также может потребоваться опубликовать эти заголовки. В этом ответе рассматривается, почему и как это сделать: Ошибка компилятора Swift: "немодульный заголовок внутри фрейм-модуля" .

Итак, сделайте следующее:

  • Удалите свой заголовочный файл.
  • Удалить ссылки на файл заголовка моста в настройках сборки для фреймворка
  • Добавьте необходимые заголовки в ваш зонтичный файл ([ProductName].h)
  • Сделайте включенные файлы общедоступными в разделе "Заголовки" в разделе "Фазы сборки".
  • Очистите и восстановите.

Примечание. "Заголовочный файл зонтика" - это файл (с именем [ProductName].h), который обычно представляет все публичные заголовки фреймворка. Обычно это список операторов #import для других заголовков, содержащихся в структуре. В Xcode, если вы откроете UIKit.h, вы увидите хороший пример зонтичного файла.

Ответ 2

См. Импорт Objective-C в Swift.

Чтобы импортировать код Objective-C в Swift из той же структуры

  • В разделе "Параметры сборки" в разделе "Упаковка" убедитесь, что для параметра "Определить модуль" для этой целевой среды рамки установлено "Да".
  • В своем заголовочном файле вашего зонтика импортируйте каждый заголовок Objective-C, который вы хотите открыть для Swift. Например:

        #import "XYZ/XYZCustomCell.h"
        #import "XYZ/XYZCustomView.h"
        #import "XYZ/XYZCustomViewController.h"
    
  • Сделайте включенные файлы общедоступными в разделе "Заголовки" в разделе "Строки сборки".

  • Очистите и перестройте.

Swift увидит каждый заголовок, открытый публично в заголовке зонтика. Содержимое файлов Objective-C в этой структуре будет доступно в любом файле Swift внутри этой целевой рамки автоматически, без каких-либо импортных операторов. Используйте свой собственный Objective-C код с тем же синтаксисом Swift, который вы используете с системными классами.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

Важно: "файл заголовка зонтика" означает файл {ModuleName}.h.  BTW, целевое имя - это {ModuleName}.framework.

Ответ 3

Есть две возможности. Добавление необходимых заголовков в заголовочный файл зонтика и их публикация - один из способов. Однако это проблема, если заголовки должны быть доступны для Swift, но не публичные.

Вторая возможность, которая сделает внутренние заголовки доступными для Swift, подробно описана здесь. По существу, необходимо создать карту модуля, подобную следующей:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

Затем это можно включить в XCode, используя параметр:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule