web-dev-qa-db-fra.com

Swift 3 UnsafePointer ($ 0) n'est plus compilé dans Xcode 8 beta 6

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?

60
Stéphane de Luca

Dans les notes de publication de Xcode 8 bêta 6:

  • Un type Unsafe[Mutable]RawPointer A été introduit, remplaçant Unsafe[Mutable]Pointer<Void>. La conversion de UnsafePointer<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. Voir bindMemory(to:capacity:), assumingMemoryBound(to:) et withMemoryRebound(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)
    }
}
126
OOPer

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

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 
}
5
Gaurav