Swift 3 UnsafePointer($0) 在 Xcode 8 beta 6 中不再编译

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

我的代码片段如下……:

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer([=12=]))
    }

… 不再编译出现以下我不理解的错误:

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

如何解决?

来自 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)

在你的情况下,你可能需要这样写:

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

替换

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
  SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer([=10=]))
}

guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {

        [=11=].withMemoryRebound(to: sockaddr.self, capacity: 1) {

            SCNetworkReachabilityCreateWithAddress(nil, [=11=])

        }

    }) else {

        return false
    }

Swift 3 更新了语法,具体解决办法是,

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