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

131

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

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

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

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

Крис Коновер
источник
«Я понимаю, что в Beta 3 отпала необходимость в фреймворках». Как?
пн
2
(для просмотра в прямом эфире) - отредактировано
Крис Коновер
1
У меня та же проблема.
Саймон Жермен
2
Ух ты, твое небольшое изменение сделало мою жизнь намного лучше - я нигде не слышал об этом изменении (устраняющем необходимость в фреймворках) и часами бился мне головой со всеми этими целями фреймворка для живых просмотров. Большое спасибо за это @chrisco!
yonix

Ответы:

233

Как указано в сообщении об ошибке, мостовые заголовки не разрешены в Frameworks. На это намекает раздел « Импорт кода из одной и той же целевой платформы» документации Apple Mix & Match . Как говорится, вам нужно: «В вашем зонтичном заголовочном файле импортировать каждый заголовок Objective-C, который вы хотите предоставить в Swift».

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

Итак, сделайте это:

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

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

DeepFriedTwinkie
источник
3
Спасибо за лаконичный ответ (помечен как таковой). Я читал этот раздел, но меня смутило различие между заголовками Umbrella и Bridging.
Крис Коновер
1
@ zaxy78 ознакомьтесь с разделом «Импорт Swift в Objective-C» этого документа: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
DeepFriedTwinkie
4
@DeepFriedTwinkie, о каком зонтичном файле вы имеете в виду, когда говорите: «Добавьте необходимые заголовки в свой зонтичный файл»? Спасибо.
Аллан Макатинграо
2
Это именно то, что мне нужно. Добавление их в публичный раздел было исправлением.
olivaresF 04
20
Правильно ли я предполагаю, что любые классы, которые я хочу сохранить частными в своей структуре, которые должны использоваться быстрым классом, теперь должны быть открыты для всех, кто использует мою структуру? Не похоже на идеальное решение.
ospr
29

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

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

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

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

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  
Ян Рюэгг
источник
2
Превосходно! Спасибо. Намного более предпочтительный метод, чем публикация всех заголовков.
Дэвид Х
Настоятельно посоветуйте это решение по сравнению с другими и посмотрите ссылку, предоставленную для подробного решения
Tancrede Chazallet
Это правильный ответ imo, но в зависимости от того, чего вы пытаетесь достичь, вы можете обойтись без некоторых макросов, предоставленных Apple, которые очень помогают с взаимодействием Swift-Objc: developer.apple.com/documentation/swift/ …
Джо Сусник
headerУтверждение принимает относительный путь. Что вы делаете, когда хотите добавить заголовки другого фреймворка?
Георгиос
13

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

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

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

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

  4. Очистите и восстановите.

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

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

Важно: «зонтичный заголовочный файл» означает файл {ModuleName} .h. Кстати, целевое имя - {ModuleName} .framework.

Ральф Шейн
источник
1
Я хочу использовать файлы objc в моем файле Swift модулей, но я не хочу предоставлять их другим модулям. Как я могу это сделать?
Sazzad Hissain Khan
0

В моем случае помогло просто удаление Objective-C Bridging Headerнастроек из моего фреймворка Build Settings.

введите описание изображения здесь

Денис Кутлубаев
источник