swift 无法将类型 'in_addr_t'(又名 'UInt32')的值转换为预期的参数类型 'UnsafeMutablePointer<in_addr_t>!'

标签 swift unsafe-pointers

我尝试像这里一样将 objective-c 的功能添加到 swift https://stackoverflow.com/a/29440193/7395969我将调用方法转换为 Swift,如下所示。但我收到错误:无法将类型“in_addr_t”(又名“UInt32”)的值转换为预期的参数类型“UnsafeMutablePointer!”在这一行:let r: Int

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 字符串转换为 Swift 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")
}

关于swift 无法将类型 'in_addr_t'(又名 'UInt32')的值转换为预期的参数类型 'UnsafeMutablePointer<in_addr_t>!',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45158171/

相关文章:

ios - 使用 UICollectionView 和 UICollectionViewCells 创建刷卡堆栈?

swift - 如何在不覆盖自然后退按钮的情况下添加左栏按钮?

swift - 在 swift3 中使用字节

swift - 如何在 Swift 中读取结构的字节

swift uipickerview 第二个组件 selectrow 不工作

swift - 创建二进制 header

ios - 使用 UnsafeMutablePointer 数组

ios - 如何在 swift 2 中垂直对齐 UIButton 添加约束?

swift - CGPathAddArc 在创建路径时遇到一些问题