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 calltakeRetainedValue()
:Note also the simplified creation of C structs like
struct sockaddr_in
which was introduced with Swift 1.2 (if I remember correctly).