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)
    }
}
Другие вопросы по тегам