2015-06-09 56 views
16

我正在尝试检查用户是否具有Internet连接,并且该过程的一部分涉及调用withUnsafePointer。在斯威夫特1.x中,我可以使用:withUnsafePointer in Swift 2

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() 
} 

但是现在有了斯威夫特2,我得到一个错误说

不能援引“withUnsafePointer”类型的参数列表“ (INOUT SOCKADDR_IN,(_) - > _)”

我看着Xcode的使用,这就是:

enter image description here

所以我试图用

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的正确方法是什么?

回答

23

错误消息是误导性的,问题是, 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结构的这是Swift 1.2引入的 (如果我没记错的话)。

+4

所以现在好多了.. – Berik

1

斯威夫特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) 
    } 
}) 
+0

喜廖氏...该行 - > SCNetworkReachabilityCreateWithAddress(零,zeroSockAddress)我得到出现以下错误.-->使用未解决的标识符'SCNetworkReachabilityCreateWithAddress' –

0

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 
     }