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.