gpt4 book ai didi

swift - Swift 框架中的 ifaddrs

转载 作者:搜寻专家 更新时间:2023-10-30 21:57:21 35 4
gpt4 key购买 nike

由于框架不支持桥接 header ,如何将 ifaddrs.h 导入到框架内的 swift 文件中?

或者是否有另一种在 LAN 上获取设备 IP 地址的方法,该方法适用于 iOS 和 OS X?

最佳答案

在应用程序目标中,桥接头可以解决问题。在框架目标内部,事情比较棘手。在 Swift 代码中,我们只能导入所谓的模块。诀窍是定义一个提供所需 C 库资源的模块映射,并通过将build设置(build设置->Swift 编译器->导入路径)中的 SWIFT_INCLUDE_PATHS 设置为模块映射文件的路径来使其可见。有两种方法可以做到这一点:

1) 下面允许通过直接公开 ifaddrs.h 接口(interface)来实现纯粹的 swift 实现,但遗憾的是需要头文件的确切路径,如果您打算将库作为开源发布,这是不可取的。

module.modulemap

module ifaddrs [system] {
header
"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/ifaddrs.h"
export *
}

添加到swift代码

import ifaddrs

2) 第二种方法是创建一个 Objective-C 类,该类提供 ifaddrs.h 的接口(interface)但隐藏了 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 *
}

添加到swift代码

import NetworkTools

有关这一切如何协同工作的更多信息,请查看:

Github 上的示例项目:https://github.com/danieleggert/mixed-swift-objc-framework

以及关于 Clang 模块的文章:http://clang.llvm.org/docs/Modules.html

关于swift - Swift 框架中的 ifaddrs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25808055/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com