I'm trying to check if the user has internet connection, and part of the process involves invoking withUnsafePointer
. In Swift 1.x, I was able to use:
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()
}
But now with Swift 2, I'm getting an error saying
Cannot invoke 'withUnsafePointer' with an argument list of type '(inout sockaddr_in, (_) -> _)'
I looked Xcode's usage, which is:
So I tried using
withUnsafePointer(&zeroAddress) {(pointer: UnsafePointer<sockaddr_in>) -> sockaddr_in in
SCNetworkReachabilityCreateWithAddress(nil, pointer).takeRetainedValue()
}
as well as
withUnsafePointer(&zeroAddress) {(pointer: UnsafePointer<sockaddr_in>) -> AnyObject in
SCNetworkReachabilityCreateWithAddress(nil, pointer).takeRetainedValue()
}
And they both give a cannot invoke...
compile-time error. What is the correct way to use withUnsafePointer
in Swift 2.x?
The error message is misleading, the problem is that
SCNetworkReachabilityCreateWithAddress()
does not return an
unmanaged object anymore, so you must not call
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))
}
Note also the simplified creation of C structs like struct sockaddr_in
which was
introduced with Swift 1.2 (if I remember correctly).
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)
}
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With