Jest to oczekiwane zachowanie kompilatora i nie bez powodu.
Myślę, że większość ludzi pracujących w tej kwestii jest spowodowane po przełączyć się one od Application Target
celu Framework Target
i rozpocząć dodawanie nagłówków C i Objective C do frameworka parasol nagłówku spodziewałem się, że mają takie samo zachowanie jak Pomostowych Nagłówek aplikacji , która zachowuje się inaczej. Nagłówek parasolowy jest tak naprawdę przeznaczony dla mieszanej frakcji swift, obj-c, a jej celem jest udostępnienie interfejsów API zewnętrznemu światu, który twoja struktura ma w celu-c lub c. Oznacza to, że nagłówki, które tam umieszczamy, powinny znajdować się w zasięgu publicznym.
Nie należy go używać jako miejsca, które naraża nagłówki Objective-C / C, które nie są częścią twojego frameworka na szybki kod twojego frameworka. Ponieważ w takim przypadku nagłówki te zostaną również udostępnione jako część naszego modułu frameworka zewnętrznemu światu, co często nie jest tym, co chcemy robić, ponieważ psuje modułowość. (I właśnie dlatego opcja Zezwala na modułowe dołączanie w modułach szkieletowych domyślnie NIE )
Aby udostępnić bibliotekę Objective-C / C w twoim szybkim kodzie frameworka, powinniśmy zdefiniować osobny moduł swift dla takiej biblioteki. Następnie import YourLegacyLibrary
można użyć standardowego swift .
Pokażę to w typowym scenariuszu: osadzenie libxml2
w naszych ramach.
1. Najpierw musisz utworzyć module.modulemap
plik, który wyglądałby w ten sposób:
W systemie OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
W systemie iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Wszystko, co robi, to to, że zawija nagłówek i wszelkie inne nagłówki, do których się odwołuje, w module swift, dzięki czemu swift będzie mógł następnie wygenerować szybkie powiązania dla tych interfejsów C.
2. Następnie w katalogu projektu xcode utwórz folder SwiftLibXML2
i umieść tam ten moduł.modulemap
3. W Ustawieniach kompilacji dodaj $(SDKROOT)/usr/include/libxml2
do Ścieżki wyszukiwania nagłówka
4. W Ustawieniach kompilacji dodaj $(SRCROOT)/SwiftLibXML2
do Importuj ścieżki
5. W zakładce Ogólne projektu dodaj libxml2.tbd
do Linked Frameworks and Libraries .
Teraz zaimportuj ten moduł w razie potrzeby za pomocą:
import SwiftLibXML2
(jeśli chcesz spojrzeć na bardziej kompletny przykład module.map, sugerowałbym powołać się na Dar.moduł module.modulemap na /usr/include/module.modulemap
, musisz mieć zainstalowane narzędzia wiersza polecenia Xcode, aby przejść tam, odwołanie Missing / usr / include w OS X El Capitan )