2015-06-09 17 views
16

Ich versuche zu überprüfen, ob der Benutzer eine Internetverbindung hat, und ein Teil des Prozesses beinhaltet das Aufrufen von withUnsafePointer. In Swift 1.x, war ich in der Lage zu verwenden: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() 
} 

Aber jetzt mit Swift 2, ich erhalte eine Fehlermeldung sagen

Kann nicht aufrufen 'withUnsafePointer' mit einem Argument Liste vom Typ ' (inout sockaddr_in, (_) -> _)‘

ich sah Xcode-Nutzung, die lautet:

enter image description here

Also habe ich versucht, mit

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

sowie

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

Und sie beide geben ein cannot invoke... Fehler bei der Kompilierung. Was ist der richtige Weg, um in Swift 2.x withUnsafePointer zu verwenden?

Antwort

23

Die Fehlermeldung ist irreführend, ist das Problem, dass SCNetworkReachabilityCreateWithAddress() kein nicht verwalteten Objekt mehr zurückkehrt, so müssen Sie rufen nicht 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)) 
} 

Beachten Sie auch die vereinfachte Erstellung von C structs wie struct sockaddr_in welches mit Swift 1.2 eingeführt wurde (wenn ich mich richtig erinnere).

+4

verwenden .. – Berik

1

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) 
    } 
}) 
+0

hallo Lio ... in der Zeile -> SCNetworkReachabilityCreateWithAddress (nil, zeroSockAddress) ich bin immer der folgende Fehler. -> Verwendung der nicht gelösten ID 'SCNetworkReachabilityCreateWithAddress' –

0

swift3 diese jetzt so viel besser

  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 
     }