2017-07-18 118 views
1

我试图添加从目标c到swift的功能,就像这里https://stackoverflow.com/a/29440193/7395969,我将调用方法转换为Swift,如下所示。但是我得到错误:无法将'in_addr_t'(又名'UInt32')类型的值转换为期望的参数类型'UnsafeMutablePointer!'在这条线:设R:诠释swift无法将类型'in_addr_t'(又名'UInt32')的值转换为期望的参数类型'UnsafeMutablePointer <in_addr_t>!'

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! 
} 

回答

2

你要的gatewayaddr.s_addr通过地址作为参数INOUT与 &。另外,gatewayaddr必须初始化:

var gatewayaddr = in_addr() 
let r = getdefaultgateway(&gatewayaddr.s_addr) 

注意,串插

ipString = "\(inet_ntoa(gatewayaddr))" 

将无法​​正常工作到C字符串转换为雨燕String, 你必须调用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") 
} 
+0

谢谢你,现在错误消失,但我得到这样的可选(0x00000001af342ca0)值,我应该如何转换成普通网关IP编辑部地址? –

+0

@EgleMatutyte:查看更新。 –

+0

谢谢你队友,工作完美,这完全是我要找的几天! –

相关问题