2015-06-09 19 views
16

Próbuję sprawdzić, czy użytkownik ma połączenie z Internetem, a część procesu obejmuje wywołanie withUnsafePointer. W Swift 1.x, udało mi się użyć:withUnsafePointer w 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() 
} 

Ale teraz z Swift 2, dostaję błąd mówiąc

nie może powoływać „withUnsafePointer” z listy argumentów typu " (inout sockaddr_in (_) -> _)”

Spojrzałem wykorzystanie Xcode, która brzmi:

enter image description here

Tak próbowałem przy użyciu

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

jak również

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

I obaj dać błąd kompilacji cannot invoke.... Jaki jest poprawny sposób użycia withUnsafePointer w Swift 2.x?

Odpowiedz

23

Komunikat o błędzie jest mylące, problemem jest to, że SCNetworkReachabilityCreateWithAddress() nie zwraca niezarządzanej obiekt już, więc nie musi wywołać 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)) 
} 

Uwaga również uproszczone tworzenie struktur C jak struct sockaddr_in który został wprowadzony za pomocą Swift 1.2 (o ile dobrze pamiętam).

+4

Więc teraz dużo lepiej .. – 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

hi Lio ... w linii -> SCNetworkReachabilityCreateWithAddress (nil, zeroSockAddress) Dostaję następujący błąd .--> użycie nierozwiązanego identyfikatora "SCNetworkReachabilityCreateWithAddress" –

0

Swift3 użyć tej

  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 
     } 
Powiązane problemy