Mon extrait de code comme suit…:
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
… Ne compile plus avec l'erreur suivante que je ne comprends pas:
"'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type."
Que faire pour le réparer?
Dans les notes de publication de Xcode 8 bêta 6:
- Un type
Unsafe[Mutable]RawPointer
A été introduit, remplaçantUnsafe[Mutable]Pointer<Void>
. La conversion deUnsafePointer<T>
ÀUnsafePointer<U>
A été refusée.Unsafe[Mutable]RawPointer
Fournit une API pour l'accès mémoire non typé et une API pour lier la mémoire à un type. La mémoire de liaison permet une conversion sécurisée entre les types de pointeurs. VoirbindMemory(to:capacity:)
,assumingMemoryBound(to:)
etwithMemoryRebound(to:capacity:)
. (SE-0107)
Dans votre cas, vous devrez peut-être écrire quelque chose comme ceci:
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
}
}
Remplacer
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
avec
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
SCNetworkReachabilityCreateWithAddress(nil, $0)
}
}) else {
return false
}
Swift 3 a mis à jour la syntaxe, la solution exacte est,
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)}
} ) else {
return false
}