2015-06-09 15 views
16

Sto provando a verificare se l'utente ha una connessione Internet e parte del processo prevede il richiamo di withUnsafePointer. In 1.x Swift, sono stato in grado di utilizzare: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() 
} 

Ma ora, con Swift 2, sto ricevendo un errore che dice

non può invocare 'withUnsafePointer' con una lista di argomenti di tipo ' (inout sockaddr_in, (_) -> _)'

ho guardato l'utilizzo di Xcode, che è:

enter image description here

Così ho provato ad utilizzare

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

così come

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

Ed entrambi invia un errore di cannot invoke... in fase di compilazione. Qual è il modo corretto di utilizzare withUnsafePointer in Swift 2.x?

risposta

23

Il messaggio di errore è fuorviante, il problema è che SCNetworkReachabilityCreateWithAddress() non restituisce un oggetto non gestito più, quindi non si deve chiamare 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)) 
} 

Nota anche la creazione semplificata di C struct come struct sockaddr_in quale era introdotto con Swift 1.2 (se non ricordo male).

+4

Molto meglio ora .. – 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 ... in linea -> SCNetworkReachabilityCreateWithAddress (nil, zeroSockAddress) sto ottenendo il seguente errore .--> uso dell'identificatore non risolto 'SCNetworkReachabilityCreateWithAddress' –

0

Swift3 utilizzare questo

  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 
     }