Bu beklenen bir derleyici davranışıdır ve çok iyi bir nedendir.
Onların arasında geçiş yaptıktan sonra bu sorunlar yaşamaya devam insanların çoğunluğu neden olur düşünmek Application Target
için Framework Target
ve çerçevenin içine C ve Objective C başlıklarını eklemeye başlayın şemsiye başlığındaki bunun gibi bir aynı davranışı olması bekleniyor uygulamanın Bridging Başlık farklı davranır. Şemsiye başlığı aslında karışık hızlı, obj-c çerçevesi için tasarlanmıştır ve amacı API'ları çerçevenizin objektif-c veya c'de olduğu dış dünyaya maruz bırakmaktır. Bu, koyduğumuz başlıkların kamuya açık olması gerektiği anlamına gelir.
Çerçevenizin bir parçası olmayan Objective-C / C başlıklarını çerçevenizin hızlı koduna maruz bırakan bir yer olarak kullanılmamalıdır. Çünkü bu durumda bu başlıklar aynı zamanda çerçeve modülümüzün dış dünyaya bir parçası olarak ortaya çıkacaktır, bu da modülerliği bozduğu için yapmak istediğimiz şey değildir. (Tam da bu yüzden Çerçeve Modüllerine Modüler Olmayan Eklemelere İzin Ver, varsayılan olarak NO'dur )
Objective-C / C kütüphanesini çerçeve swift kodunuza göstermek için, bu kütüphane için ayrı bir swift modülü tanımlamalıyız. Daha sonra standart bir kaydırma import YourLegacyLibrary
kullanılabilir.
Bunu bazı tipik senaryolarda göstereyim: libxml2
çerçevemize gömmek .
1. İlk önce module.modulemap
şu şekilde görünecek bir dosya oluşturmanız gerekir :
OSX çerçevesi için:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
İOS çerçevesi için:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Yaptığı tek şey, üstbilgiyi ve swift modülünün içinde referans verdiği diğer başlıkları sararak, böylece daha sonra hızlılık bu C arayüzleri için hızlı bağlar oluşturabilir.
2. Daha sonra xcode proje dizininizde bir klasör oluşturun SwiftLibXML2
ve bu module.modulemap dosyasını buraya yerleştirin
3. yılında Yapı Ayarlar eklemek $(SDKROOT)/usr/include/libxml2
için Başlık Arama Yolları
4. yılında Yapı Ayarlar eklemek $(SRCROOT)/SwiftLibXML2
için İthalat Yollar
5. Altında Projesi Genel sekmesi eklemek libxml2.tbd
için Bağlantılı kafes ve Kütüphaneleri .
Şimdi bu modülü gereken yerlerde içe aktarın:
import SwiftLibXML2
(daha eksiksiz bir module.map örneğine bakmak istiyorsanız, Darwin'in module.modulemap'ine /usr/include/module.modulemap
başvurmayı öneririm , oraya gitmek için Xcode komut satırı araçlarına sahip olmanız gerekir, Eksik / usr / OS X El Capitan'a bakın )