在应用程序目标中,桥接标头可以解决问题.在框架目标内部,事情比较棘手.在
Swift代码中,我们只能导入所谓的模块.诀窍是定义一个模块映射,通过将构建设置(Build Settings-> Swift Compiler-> Import Paths)中的SWIFT_INCLUDE_PATHS设置为模块映射文件的路径,提供所需的C库资源并使其可见.有两种方法可以做到这一点:
原文链接:https://www.f2er.com/swift/319142.html1)以下允许通过直接公开ifaddrs.h接口来实现纯粹的swift实现,但遗憾的是需要一个精确的头文件路径,如果您要将库作为开源发布,这是不可取的.
module.modulemap
module ifaddrs [system] { header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/ifaddrs.h" export * }
import ifaddrs
2)第二种方法是创建一个Objective-C类,它为ifaddrs.h提供一个接口,但隐藏ifaddrs.h的实际导入源* .m文件.
NetworkTools.h
@interface NetworkTools : NSObject + (NSDictionary *)getIFAddresses; @end
NetworkTools.m
#import "NetworkTools.h" #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> #include <netdb.h> @implementation NetworkTools + (NSDictionary *)getIFAddresses { NSDictionary *addresses; // code return addresses; }
module.modulemap
module NetworkTools { header "Obj-C Tools/NetworkTools.h" export * }
import NetworkTools
有关这一切如何协同工作的更多信息,请查看:
Github上的示例项目:https://github.com/danieleggert/mixed-swift-objc-framework
以及关于Clang模块的文章:http://clang.llvm.org/docs/Modules.html