Xcode 8 beta 6中,Swift 3的UnsafePointer($0)不再编译通过。

60

我的代码片段如下:

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

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

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

如何修复它?


3
请注意,https://dev59.com/Xl8e5IYBdhLWcg3wja_5#25623647已经更新以适用于当前的Swift 3。 - Martin R
3个回答

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)
    }
}

18

替换

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

随着

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

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

            SCNetworkReachabilityCreateWithAddress(nil, $0)

        }

    }) else {

        return false
    }

5

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接