次のように私のコードスニペット...:
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."
修正するにはどうすればよいですか?
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)
}
}
交換
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
}
Swift 3は構文を更新しました、正確な解決策は、
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)}
} ) else {
return false
}