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 ベータ 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)
    }
}
于 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 に答える