【问题标题】:Cannot convert (Timer!) -> Void to ((CFRunLoopTimer?) ->Void)! - Converting NSTimer extension to Swift 3无法将 (Timer!) -> Void 转换为 ((CFRunLoopTimer?) ->Void)! - 将 NSTimer 扩展转换为 Swift 3
【发布时间】:2016-09-20 13:46:49
【问题描述】:

我正在尝试将我在项目中使用的 Pod 转换为 Swift 3。我没有编写它,但原作者没有更新它,所以我分叉了它,我想自己做。但是……

尝试将扩展名转换为 NSTimer 到 Swift 3 时出现此错误: Cannot convert value of type '(Timer!) -> Void' to expected argument type '((CFRunLoopTimer?) -> Void)!

似乎 Swift 3 处理程序类型 (Timer!) -> Void 与老派的 CFRunLoop 样式处理程序不兼容,但我不确定如何在保持与 iOS 9 的兼容性的同时进行转换。

我正在粘贴下面的代码,由 Xcode 转换。您可以在https://github.com/entotsu/TKSubmitTransition/blob/master/SubmitTransition/Classes/NSTimerEx.swift找到原始代码

干杯

import Foundation
extension Timer {
    class func schedule(delay delay: TimeInterval, handler: (Timer!) -> Void) -> NSTimer {
        let fireDate = delay + CFAbsoluteTimeGetCurrent()
        let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, 0, 0, 0, handler) // Error on this line
        CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
        return timer
    }

    class func schedule(repeatInterval interval: TimeInterval, handler: @escaping (Timer!) -> Void) -> Timer {
        let fireDate = interval + CFAbsoluteTimeGetCurrent()
        let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, interval, 0, 0, handler) // And this line
        CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
        return timer
    }
}

【问题讨论】:

    标签: ios swift timer nstimer swift3


    【解决方案1】:

    试试这样:

    extension Timer {
        class func schedule(delay: TimeInterval, handler: ((Timer?) -> Void)!) -> Timer! {
            let fireDate = delay + CFAbsoluteTimeGetCurrent()
            let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, 0, 0, 0, handler)
            CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, .commonModes)
            return timer
        }
        class func schedule(repeatInterval interval: TimeInterval, handler: ((Timer?) -> Void)!) -> Timer! {
            let fireDate = interval + CFAbsoluteTimeGetCurrent()
            let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, interval, 0, 0, handler)
            CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, .commonModes)
            return timer
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多