Đây là một hành vi biên dịch dự kiến và vì một lý do rất tốt.
Tôi nghĩ đa số người dân chạy vào các vấn đề này là do sau khi họ chuyển từ Application Target
đến Framework Target
và bắt đầu thêm C và header C Mục tiêu vào khuôn khổ của tiêu đề ô mong đợi nó để có một hành vi tương tự như Bridging Tiêu đề của ứng dụng , mà ứng xử khác nhau. Tiêu đề ô thực sự được chỉ định cho swift hỗn hợp, khung obj-c và mục đích của nó là đưa các API ra thế giới bên ngoài mà khung của bạn có trong object-c hoặc c. Điều đó có nghĩa là các tiêu đề chúng tôi đặt ở đó phải nằm trong phạm vi công cộng.
Không nên sử dụng nó làm nơi trưng bày các tiêu đề Objective-C / C không phải là một phần của khung công tác đối với mã nhanh chóng của khung công tác của bạn. Bởi vì trong trường hợp đó, các tiêu đề này cũng sẽ được đưa ra như một phần của mô-đun khung của chúng ta với thế giới bên ngoài, thường không phải là những gì chúng ta muốn làm vì nó phá vỡ mô-đun. (Và đó chính xác là lý do tại sao Cho phép Không mô-đun Bao gồm trong Mô-đun khung mặc định thành NO )
Để hiển thị thư viện Objective-C / C cho mã swift khung của bạn, chúng ta nên xác định một mô-đun swift riêng cho thư viện đó. Sau đó, một swift tiêu chuẩn import YourLegacyLibrary
có thể được sử dụng.
Hãy để tôi chứng minh điều này trên một số kịch bản điển hình: nhúng libxml2
vào khuôn khổ của chúng tôi.
1. Trước tiên bạn cần tạo một module.modulemap
tệp trông theo cách này:
Đối với khung OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Đối với khung iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Tất cả những gì nó làm là nó bọc tiêu đề và bất kỳ tiêu đề nào khác mà nó tham chiếu bên trong mô-đun swift, do đó swift sau đó sẽ có thể tạo các liên kết nhanh cho các giao diện C này.
2. Sau đó, trong thư mục dự án xcode của bạn tạo một thư mục SwiftLibXML2
và đặt module.modulemap này vào đó
3. Trong Cài đặt bản dựng , thêm $(SDKROOT)/usr/include/libxml2
vào Đường dẫn tìm kiếm tiêu đề
4. Trong Cài đặt bản dựng , thêm $(SRCROOT)/SwiftLibXML2
vào đường dẫn nhập
5. Trong tab Chung của Dự án , thêm libxml2.tbd
vào Thư viện và Khung được liên kết .
Bây giờ bạn nhập mô-đun này khi cần thiết với:
import SwiftLibXML2
(nếu bạn muốn xem một ví dụ module.map hoàn chỉnh hơn, tôi khuyên bạn nên tham khảo module.modulemap của Darwin tại /usr/include/module.modulemap
, bạn sẽ cần cài đặt các công cụ dòng lệnh Xcode để đến đó, tham khảo Thiếu / usr / bao gồm trong OS X El Capitan )