Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift 3 UnsafePointer($0) no longer compile in Xcode 8 beta 6

My code snipet as follows …:

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

… does no longer compile with the following error which I don't understand:

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

What to do to fix it?

like image 526
Stéphane de Luca Avatar asked Aug 19 '16 19:08

Stéphane de Luca


2 Answers

From the Release Notes of Xcode 8 beta 6:

  • An Unsafe[Mutable]RawPointer type has been introduced, replacing Unsafe[Mutable]Pointer<Void>. Conversion from UnsafePointer<T> to UnsafePointer<U> has been disallowed. Unsafe[Mutable]RawPointer provides an API for untyped memory access, and an API for binding memory to a type. Binding memory allows for safe conversion between pointer types. See bindMemory(to:capacity:), assumingMemoryBound(to:), and withMemoryRebound(to:capacity:). (SE-0107)

In your case, you may need to write something like this:

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {     $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in         SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)     } } 
like image 64
OOPer Avatar answered Sep 19 '22 05:09

OOPer


Replace

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

with

guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {          $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {              SCNetworkReachabilityCreateWithAddress(nil, $0)          }      }) else {          return false     } 
like image 27
macfnl Avatar answered Sep 22 '22 05:09

macfnl