web-dev-qa-db-ja.com

Swift 3 UnsafePointer($ 0)はXcode 8ベータ6でコンパイルされなくなりました

次のように私のコードスニペット...:

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

修正するにはどうすればよいですか?

60

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

交換

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
    }
17
macfnl

Swift 3は構文を更新しました、正確な解決策は、

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