Подтвердить что ты не робот

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."

Что делать, чтобы исправить это?

4b9b3361

Ответ 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 
}