Esse é um comportamento esperado do compilador e por um motivo muito bom.
Eu acho que a maioria das pessoas que se deparam com esses problemas é causada depois que eles alternam Application Target
para Framework Target
e começam a adicionar cabeçalhos C e Objective C no cabeçalho guarda-chuva da estrutura, esperando que ele tenha o mesmo comportamento do Bridging Header do aplicativo , que se comporta de maneira diferente. O cabeçalho guarda-chuva é realmente designado para uma estrutura mista rápida, obj-c e seu objetivo é expor as APIs para o mundo externo que sua estrutura possui na objetiva-c ou c. Isso significa que os cabeçalhos que colocamos devem estar no âmbito público.
Não deve ser usado como um local que expõe os cabeçalhos de Objective-C / C que não fazem parte da sua estrutura ao código rápido da sua estrutura. Porque, nesse caso, esses cabeçalhos também serão expostos como parte do nosso módulo de estrutura ao mundo exterior, o que geralmente não é o que queremos fazer, pois quebra a modularidade. (E é exatamente por isso que permite a inclusão de módulos não modulares no padrão para NO )
Para expor a biblioteca Objective-C / C ao seu código swift da estrutura, devemos definir um módulo swift separado para essa biblioteca. Em seguida, um swift padrão import YourLegacyLibrary
pode ser usado.
Deixe-me demonstrar isso em um cenário típico: incorporação libxml2
em nossa estrutura.
1. Você primeiro precisa criar um module.modulemap
arquivo com a seguinte aparência:
Para estrutura OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Para estrutura iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Tudo o que faz é envolver o cabeçalho e quaisquer outros cabeçalhos que ele referenciar dentro do módulo swift, para que o swift possa gerar as ligações rápidas para essas interfaces C.
2. Em seguida, no diretório do projeto xcode, crie uma pasta SwiftLibXML2
e coloque este module.modulemap lá
3. Em Configurações de compilação , adicione $(SDKROOT)/usr/include/libxml2
aos Caminhos de pesquisa de cabeçalho
4. Em Configurações de compilação , adicione $(SRCROOT)/SwiftLibXML2
aos Caminhos de importação
5. Na guia Geral do projeto , adicione libxml2.tbd
às estruturas e bibliotecas vinculadas .
Agora você importa este módulo onde necessário com:
import SwiftLibXML2
(se você quiser procurar um exemplo module.map mais completo, sugiro que você faça referência ao module.modulemap de Darwin em /usr/include/module.modulemap
, você precisará ter as ferramentas de linha de comando do Xcode instaladas para ir até lá, referência Missing / usr / include no OS X El Capitan )