我尝试将函数从目标 c 添加到 swift 中,就像这里一样 https://stackoverflow.com/a/29440193/7395969 我将调用方法转换为 Swift,如下所示。但是我收到错误:无法将类型"in_addr_t"(又名"UInt32"(的值转换为预期的参数类型"不安全的可变指针!
func getGatewayIP() -> String {
var ipString: String? = nil
let gatewayaddr: in_addr
let r: Int = getdefaultgateway((gatewayaddr.s_addr))
if r >= 0 {
ipString = "(inet_ntoa(gatewayaddr))"
print("default gateway : (ipString)")
}
else {
print("getdefaultgateway() failed")
}
return ipString!
}
你必须传递gatewayaddr.s_addr
的地址作为inout参数 与&
.此外,还必须初始化gatewayaddr
:
var gatewayaddr = in_addr()
let r = getdefaultgateway(&gatewayaddr.s_addr)
请注意,字符串插值
ipString = "(inet_ntoa(gatewayaddr))"
将无法将 C 字符串转换为 SwiftString
, 你必须打电话给String(cString:)
.也
return ipString!
如果无法确定网关,将崩溃。
安全版本示例:
func getGatewayIP() -> String? {
var gatewayaddr = in_addr()
let r = getdefaultgateway(&gatewayaddr.s_addr)
if r >= 0 {
return String(cString: inet_ntoa(gatewayaddr))
} else {
return nil
}
}
if let gateway = getGatewayIP() {
print("default gateway", gateway)
} else {
print("getGatewayIP() failed")
}