web-dev-qa-db-de.com

Swift 3 UnsafePointer ($ 0) wird in Xcode 8 Beta 6 nicht mehr kompiliert

Mein Code-Snippet sieht wie folgt aus:

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
    }

… Kompiliert nicht mehr mit folgendem Fehler, den ich nicht verstehe:

"'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type."

Was tun, um das Problem zu beheben?

60

Aus den Versionshinweisen von Xcode 8 Beta 6:

  • Ein Typ Unsafe[Mutable]RawPointer Wurde eingeführt, der Unsafe[Mutable]Pointer<Void> Ersetzt. Die Konvertierung von UnsafePointer<T> Nach UnsafePointer<U> Wurde abgelehnt. Unsafe[Mutable]RawPointer Bietet eine API für den untypisierten Speicherzugriff und eine API zum Binden von Speicher an einen Typ. Bindungsspeicher ermöglicht die sichere Konvertierung zwischen Zeigertypen. Siehe bindMemory(to:capacity:), assumingMemoryBound(to:) und withMemoryRebound(to:capacity:). (SE-0107)

In Ihrem Fall müssen Sie möglicherweise Folgendes schreiben:

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

Ersetzen

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
  SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}

mit

guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {

        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {

            SCNetworkReachabilityCreateWithAddress(nil, $0)

        }

    }) else {

        return false
    }
17
macfnl

Swift 3 aktualisiert die Syntax, genaue Lösung ist,

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