60 votes

Swift 3 UnsafePointer ($ 0) ne compile plus dans Xcode 8 beta 6

Mon code snipet 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?

126voto

OOPer Points 33473

Depuis les Notes de Version de Xcode beta 8 6:

  • Un Unsafe[Mutable]RawPointer type a été introduit, en remplaçant Unsafe[Mutable]Pointer<Void>. La Conversion de UnsafePointer<T>de UnsafePointer<U> a été refusée. Unsafe[Mutable]RawPointer fournit une API pour le non accès à la mémoire, et une API pour la liaison la mémoire à un type. La liaison de la mémoire permet pour la sécurité de conversion entre types de pointeur. Voir bindMemory(to:capacity:), assumingMemoryBound(to:), et withMemoryRebound(to:capacity:). (SE-0107)

Dans votre cas, vous pouvez avoir besoin d'écrire quelque chose comme ceci:

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

17voto

macfnl Points 399

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
    }
 

5voto

Gaurav Points 277

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 
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X