2016-08-19 2 views
58

Мой код 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." 

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

+3

Обратите внимание, что http://stackoverflow.com/a/25623647/1187415 был обновлен для текущего Swift 3. –

ответ

119

Из примечаний к выпуску в Xcode 8 бета 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) 
    } 
} 
+0

Да, это работает для me..Thanks – TBI

18

Заменить

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

Swift 3 обновил синтаксис, точное решение -

guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, { 
    $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { 
     zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)} 
}) else { 
    return false 
} 
Смежные вопросы