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?
Aus den Versionshinweisen von Xcode 8 Beta 6:
- Ein Typ
Unsafe[Mutable]RawPointer
Wurde eingeführt, derUnsafe[Mutable]Pointer<Void>
Ersetzt. Die Konvertierung vonUnsafePointer<T>
NachUnsafePointer<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. SiehebindMemory(to:capacity:)
,assumingMemoryBound(to:)
undwithMemoryRebound(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)
}
}
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
}
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
}