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."

该怎么做才能修复它?

4

3 回答 3

126

来自 Xcode 8 beta 6 的发行说明:

  • Unsafe[Mutable]RawPointer引入了一种类型,替换Unsafe[Mutable]Pointer<Void>. 不允许从UnsafePointer<T>to 转换。 提供用于无类型内存访问的 API,以及用于将内存绑定到类型的 API。绑定内存允许指针类型之间的安全转换。请参阅、和。(SE-0107)UnsafePointer<U>Unsafe[Mutable]RawPointerbindMemory(to:capacity:)assumingMemoryBound(to:)withMemoryRebound(to:capacity:)

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

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
    $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
        SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
    }
}
于 2016-08-19T21:45:53.617 回答
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
    }
于 2016-09-29T08:04:50.763 回答
5

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

guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
    $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
        zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)} 
} ) else { 
    return false 
}
于 2017-01-10T12:04:04.253 回答