이것은 예상되는 컴파일러 동작이며 매우 좋은 이유입니다.
이 문제를 겪고있는 사람들의 대다수는 C와 Objective C 헤더를 전환 하고 응용 프로그램의 Bridging Header 와 동일한 동작을 기대하는 프레임 워크의 우산 헤더에 추가 Application Target
하기 Framework Target
시작한 후에 발생한다고 생각합니다 . 엄브렐러 헤더는 실제로 혼합 된 신속한 obj-c 프레임 워크 용으로 지정되었으며 목적은 프레임 워크가 objective-c 또는 c에있는 외부 세계에 API를 노출시키는 것입니다. 그것은 우리가 넣은 헤더가 공개 범위에 있어야 함을 의미합니다.
프레임 워크의 일부가 아닌 Objective-C / C 헤더를 프레임 워크의 신속한 코드에 노출하는 장소로 사용해서는 안됩니다. 이 경우 이러한 헤더는 프레임 워크 모듈의 일부로 외부에 노출되기 때문에 모듈성을 깨뜨리기 때문에 수행하지 않는 경우가 많습니다. (그래서 프레임 워크 모듈에 비 모듈 식 포함 허용이 기본값으로 NO 인 이유 )
Objective-C / C 라이브러리를 프레임 워크 스위프트 코드에 노출 시키려면 해당 라이브러리에 대해 별도의 스위프트 모듈을 정의해야합니다. 그런 다음 표준 스위프트를 import YourLegacyLibrary
사용할 수 있습니다.
libxml2
프레임 워크에 포함하는 몇 가지 일반적인 시나리오에서이를 설명하겠습니다 .
1. 먼저 module.modulemap
다음과 같은 파일 을 작성해야합니다 .
OSX 프레임 워크의 경우 :
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 *
}
그것은 swift 모듈 내에서 헤더와 참조하는 다른 헤더를 마무리하여 swift가 이러한 C 인터페이스에 대한 신속한 바인딩을 생성 할 수 있도록하는 것입니다.
2. xcode 프로젝트 디렉토리에 폴더 SwiftLibXML2
를 만들고이 모듈을 넣습니다.
3. 에서 빌드 설정 , 추가 $(SDKROOT)/usr/include/libxml2
로 헤더 검색 경로
4. 에서 빌드 설정 , 추가 $(SRCROOT)/SwiftLibXML2
로 가져 오기 경로
5. 아래에서 프로젝트의 일반 탭을 추가 libxml2.tbd
로 링크 된 프레임 워크 및 라이브러리 .
이제 필요한 곳에서이 모듈을 가져옵니다.
import SwiftLibXML2
(보다 완전한 module.map 예제를 보려면에서 Darwin의 module.modulemap을 참조하는 것이 좋습니다 .Xcode /usr/include/module.modulemap
명령 줄 도구가 설치되어 있어야합니다 .OS X El Capitan에 / usr / include 누락 참조 )