Xcode 6 / Beta 4: використання мостових заголовків із рамковими цілями не підтримується


131

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

помилка: використання мостових заголовків із рамковими цілями не підтримується

Я нічого не бачив у замітках до випуску чи не знайшов іншого шляху міграції. Хтось ще бачив це і прийшов до рішення?

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


"Я усвідомлюю, що Beta 3 ліквідувала потребу в структурах". Як?
hnh

2
(для перегляду в прямому ефірі) - відредаговано
Chris Conover

1
Я стикаюся з тією ж проблемою.
Саймон Жермен

2
Нічого собі, ваша маленька редакція там просто зробила моє життя набагато кращою - я не чув про цю зміну (усуваючи потребу в рамках) десь і годинами стукав головою про всі ці рамкові цілі для перегляду в прямому ефірі годинами. Дякую вам за це @chrisco!
yonix

Відповіді:


232

Як зазначається помилка, мости мотових заголовків у Frameworks заборонені. Код про імпорт із тієї ж рамкової цілі, що міститься в документації на яблуко Mix & Match, на це натякає. Як вони кажуть, вам потрібно «У файлі заголовка парасольки імпортувати кожен заголовок Objective-C, який ви хочете піддати Swift».

Однак я виявив, що вам можуть знадобитися також оприлюднити ці конкретні заголовки. У цій відповіді розглядається, чому і як це зробити: Помилка компілятора Swift: "Немодульний заголовок всередині рамкового модуля" .

Отже, зробіть це:

  1. Видаліть свій містковий заголовок.
  2. Видаліть посилання на з'єднувальний файл заголовка в налаштуваннях збірки для фреймворку
  3. Додайте необхідні заголовки до файлу парасольки ([ProductName] .h)
  4. Опублікуйте включені файли загальнодоступними у розділі "Заголовки" рамки "Фази збірки".
  5. Почистіть і відновіть.

Примітка : "Файл заголовка парасольки" - це файл (названий [ProductName] .h), який, як правило, представляє всі загальнодоступні заголовки рамки. Зазвичай це лише перелік # імпортних висловлювань до інших заголовків, що містяться в рамках. У Xcode, якщо ви відкриєте UIKit.h, ви побачите хороший приклад файлу парасольки.


3
Дякуємо за стислий відповідь (позначений як такий). Я прочитав цей розділ, але був розгублений щодо розрізнення парасольки Umbrella та Bridging.
Кріс Коновер

1
@ zaxy78 перегляньте розділ "Імпорт швидкого переходу в об'єктив-C" цього документа: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
DeepFriedTwinkie

4
@DeepFriedTwinkie, на який файл парасольки ви посилаєтесь, говорячи: "Додати потрібні заголовки до файлу парасольки"? Дякую.
Алан Макатінгао

2
Це саме те, що мені було потрібно. Додавання їх до публічного розділу було виправленням.
olivaresF

20
Чи правильно я припускаю, що будь-які класи, які я хочу зберегти приватними у своїх рамках, які повинні бути використані швидким класом, тепер повинні бути оприлюднені для всіх, хто використовує мою основу? Це не здається ідеальним рішенням.
ospr

28

Є дві можливості. Додавання необхідних заголовків до файлу заголовка парасольки та оприлюднення їх є одним із способів. Однак це проблема, якщо заголовки повинні бути доступні 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

Див. Розділ Імпорт об'єкта 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. BTW, цільове ім'я - {ModuleName} .framework.


1
Я хочу використовувати файли objc всередині своїх файлів Swift, але я не хочу виставляти їх іншим модулям. Як я можу це зробити?
Саццад Хассейн Хан

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.