SCNetworkReachabilityCallBack? проблема преобразования типов с Swift3.0
Поскольку преобразование Swift 2.3 в Swift 3.0 вызывает много проблем, я пытаюсь решить эту проблему, но пока не получаю решения.
Невозможно преобразовать значение типа '(SCNetworkReachability, flags: SCNetworkReachabilityFlags, info: UnsafeMutablePointer) -> ()' в ожидаемый тип аргумента 'SCNetworkReachabilityCallBack?'
Вот мой код:
func callback(_ reachability:SCNetworkReachability, flags: SCNetworkReachabilityFlags, info: UnsafeMutablePointer<Void>) {
let reachability = Unmanaged<Reachability>.fromOpaque(info).takeUnretainedValue()
DispatchQueue.main.async {
reachability.reachabilityChanged(flags)
}
}
В startNotifier
функция, которую мы проходим callback
, но это генерирует ошибку.
public func startNotifier() throws {
guard !notifierRunning else { return }
var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
context.info = UnsafeMutablePointer(Unmanaged.passUnretained(self).toOpaque())
//THIS LINE GENERATES ERROR WARNING
if !SCNetworkReachabilitySetCallback(reachabilityRef!, callback, &context) {
stopNotifier()
throw ReachabilityError.unableToSetCallback
}
if !SCNetworkReachabilitySetDispatchQueue(reachabilityRef!, reachabilitySerialQueue) {
stopNotifier()
throw ReachabilityError.unableToSetDispatchQueue
}
// Perform an intial check
reachabilitySerialQueue.async { () -> Void in
let flags = self.reachabilityFlags
self.reachabilityChanged(flags)
}
notifierRunning = true
}
Этот код генерирует ошибку в вышеуказанной функции.
//THIS LINE GENERATES ERROR WARNING
if !SCNetworkReachabilitySetCallback(reachabilityRef!, callback, &context) {
stopNotifier()
throw ReachabilityError.unableToSetCallback
}
Я также подробно прохожу этот пост Мартина, но не получаю решения. Любая помощь должна быть заметной. Заранее спасибо.
1 ответ
Если у вас есть что-то странное в Swift 3, всегда проверяйте последнюю ссылку: (На данный момент последняя ссылка относится к последней версии Xcode 8, бета 6. Если вы используете бета-версию 5 или старше, приведенный ниже код не работает.)
декларация
typealias SCNetworkReachabilityCallBack = ( SCNetworkReachability, SCNetworkReachabilityFlags, UnsafeMutableRawPointer?) -> Void
Тип последнего параметра обратного вызова изменился на UnsafeMutableRawPointer?
,
Таким образом, вам может понадобиться изменить callback
что-то вроде этого:
func callback(_ reachability:SCNetworkReachability, flags: SCNetworkReachabilityFlags, info: UnsafeMutableRawPointer?) {
let reachability = Unmanaged<Reachability>.fromOpaque(info!).takeUnretainedValue()
DispatchQueue.main.async {
reachability.reachabilityChanged(flags)
}
}