Swift 3 UnsafePointer ($ 0) ne comstack plus dans Xcode 8 beta 6

Mon code snipet comme suit…:

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)) } 

… Ne comstack plus avec l’erreur suivante que je ne comprends pas:

 "'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type." 

Que faire pour y remédier?

A partir des notes de publication de Xcode 8 beta 6:

  • Un type Unsafe[Mutable]RawPointer a été introduit, remplaçant le Unsafe[Mutable]Pointer . La conversion de UnsafePointer en UnsafePointer a été interdite. Unsafe[Mutable]RawPointer fournit une API pour un access mémoire non typé et une API pour lier la mémoire à un type. La mémoire de liaison permet une conversion sûre entre les types de pointeurs. Voir bindMemory(to:capacity:) , assumingMemoryBound(to:) et withMemoryRebound(to:capacity:) . (SE-0107)

Dans votre cas, vous devrez peut-être écrire quelque chose comme ceci:

 let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) } } 

Remplacer

 let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)) } 

avec

 guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0) } }) else { return false } 

Swift 3 a mis à jour la syntaxe, la solution exacte est,

 guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)} } ) else { return false }