首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Swift 2中的withUnsafePointer

Swift 2中的withUnsafePointer
EN

Stack Overflow用户
提问于 2015-06-10 02:28:15
回答 3查看 5.9K关注 0票数 17

我正在尝试检查用户是否有internet连接,其中一部分过程涉及调用withUnsafePointer。在Swift 1.x中,我能够使用:

var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)

let defaultRouteReachability = withUnsafePointer(&zeroAddress){
    SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
}

但是现在在Swift 2中,我收到一个错误,说

无法使用类型为“(inout sockaddr_in,(_) -> _)”的参数列表调用“withUnsafePointer”

我查看了Xcode的用法,它是:

所以我试着用

withUnsafePointer(&zeroAddress) {(pointer: UnsafePointer<sockaddr_in>) -> sockaddr_in in
    SCNetworkReachabilityCreateWithAddress(nil, pointer).takeRetainedValue()
}

以及

withUnsafePointer(&zeroAddress) {(pointer: UnsafePointer<sockaddr_in>) -> AnyObject in
    SCNetworkReachabilityCreateWithAddress(nil, pointer).takeRetainedValue()
}

并且它们都会给出一个cannot invoke...编译时错误。在Swift 2.x中使用withUnsafePointer的正确方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-10 02:34:21

错误消息具有误导性,问题在于SCNetworkReachabilityCreateWithAddress()不再返回非托管对象,因此您不能调用takeRetainedValue()

var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)

let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
    SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}

还要注意像struct sockaddr_in这样的C结构的简化创建,它是在Swift1.2中引入的(如果我没记错的话)。

票数 23
EN

Stack Overflow用户

发布于 2016-09-20 19:04:05

Swift 3:

var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
    _ = $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress in
        SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
    }
})
票数 2
EN

Stack Overflow用户

发布于 2016-11-15 18:35:27

Swift3使用这个

         var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
         zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
         zeroAddress.sin_family = sa_family_t(AF_INET)

         let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
                SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
            }
        }

        var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
        if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
            return false
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30740000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档