Swift 3 UnsafePointer ($ 0) больше не компилируется в Xcode 8 beta 6
Мой код snipet выглядит следующим образом:
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
... больше не компилируется со следующей ошибкой, которую я не понимаю:
"'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type."
Что делать, чтобы исправить это?
Ответы
Ответ 1
Из примечаний к выпуску Xcode 8 beta 6:
- Был введен тип
Unsafe[Mutable]RawPointer
, заменив Unsafe[Mutable]Pointer<Void>
. Преобразование из UnsafePointer<T>
в UnsafePointer<U>
было запрещено. Unsafe[Mutable]RawPointer
предоставляет API для доступа к нетипизированной памяти и API для привязки памяти для типа. Память привязки обеспечивает безопасное преобразование между типы указателей. См. bindMemory(to:capacity:)
, assumingMemoryBound(to:)
, и withMemoryRebound(to:capacity:)
. (SE-0107)
В вашем случае вам может понадобиться написать что-то вроде этого:
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
}
}
Ответ 2
Заменить
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
с
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
SCNetworkReachabilityCreateWithAddress(nil, $0)
}
}) else {
return false
}
Ответ 3
Swift 3 обновил синтаксис, точное решение,
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)}
} ) else {
return false
}