Це очікувана поведінка компілятора і з дуже поважної причини.
Я думаю, що більшість людей, які стикаються з цими проблемами, викликані після того, як вони переходять Application Target
на Framework Target
та починають додавати заголовки C та Об'єктивного C в заголовок парасольки Framework, очікуючи, що він буде таким же, як і мостовий заголовок програми , який веде себе по-різному. Заголовок парасольки насправді призначений для змішаного швидкого, obj-c фреймворку і його метою є відкриття API-кодів зовнішньому світу, який має ваша рамка у target-c або c. Це означає, що заголовки, які ми розміщуємо там, повинні бути загальнодоступними.
Він не повинен використовуватися як місце, яке виставляє заголовки Objective-C / C, які не є частиною вашої системи, швидким кодом вашої рамки. Тому що в цьому випадку ці заголовки також будуть піддані впливу зовнішнього світу як частини нашого базового модуля, що часто не є тим, що ми хочемо зробити, оскільки це порушує модульність. (І саме тому Дозволяє Немодульна Включає в Рамкові модулі за замовчуванням НІ )
Для того, щоб відкрити бібліотеку Objective-C / C до вашого швидкого коду фреймворку, ми повинні визначити окремий модуль swift для такої бібліотеки. Тоді import YourLegacyLibrary
можна використовувати стандартний стрімкий .
Дозвольте мені продемонструвати це за деяким типовим сценарієм: вбудовування libxml2
у наші рамки.
1. Спочатку потрібно створити module.modulemap
файл, який виглядатиме так:
Для ОСX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Для iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Все, що він робить, - це загортання заголовка та будь-яких інших заголовків, на які він посилається всередині модуля швидкого переходу, так що швидкий зможе потім створити швидкі прив’язки для цих інтерфейсів С.
2. Тоді у своєму каталозі проектів xcode створіть папку SwiftLibXML2
і помістіть туди цей module.modulemap
3. У Налаштуваннях збірки додайте $(SDKROOT)/usr/include/libxml2
до Шляхів пошуку заголовків
4. У налаштуваннях збірки додайте $(SRCROOT)/SwiftLibXML2
до імпорту шляхів
5. На вкладці Загальне проекту додайте libxml2.tbd
до пов'язаних рамок і бібліотек .
Тепер ви імпортуєте цей модуль, де потрібно:
import SwiftLibXML2
(якщо ви хочете переглянути більш повний приклад module.map, я б запропонував посилатись на модуль Dar.'s module.modulemap /usr/include/module.modulemap
, вам потрібно буде встановити інструменти командного рядка Xcode, щоб перейти туди, посилання Missing / usr / включити в OS X El Capitan )