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

Sté*_*uca 60 unsafe-pointers swift3 xcode8-beta6

我的代码snipet如下......:

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
    }
Run Code Online (Sandbox Code Playgroud)

...不再使用以下错误编译,我不明白:

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

该怎么做才能修复它?

OOP*_*Per 126

从Xcode 8 beta 6的发行说明:

  • Unsafe[Mutable]RawPointer已经引入了一种类型,取而代之Unsafe[Mutable]Pointer<Void>.转换UnsafePointer<T>UnsafePointer<U>已被禁止.Unsafe[Mutable]RawPointer 提供用于非类型化内存访问的API,以及用于将内存绑定到类型的API.绑定内存允许指针类型之间的安全转换.见bindMemory(to:capacity:),assumingMemoryBound(to:)withMemoryRebound(to:capacity:).(SE-0107)

在您的情况下,您可能需要编写如下内容:

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


小智 17

更换

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
  SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
Run Code Online (Sandbox Code Playgroud)

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

        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {

            SCNetworkReachabilityCreateWithAddress(nil, $0)

        }

    }) else {

        return false
    }
Run Code Online (Sandbox Code Playgroud)


Gau*_*rav 5

Swift 3更新了语法,确切的解决方案是,

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