无法转换(定时器!) – >无效(((CFRunLoopTimer?) – >无效)! – 将NSTimer扩展转换为Swift 3
我试图将我在我的项目中使用的Pod转换为Swift 3.我没有写它,但原来的作者没有更新它,所以我分叉它,我试图自己做。 但…
我得到这个错误试图将扩展名转换为NSTimer
到Swift 3: Cannot convert value of type '(Timer!) -> Void' to expected argument type '((CFRunLoopTimer?) -> Void)!
看起来,Swift 3处理程序types(Timer!) -> Void
与旧的CFRunLoop
风格的处理程序不兼容,但我不确定如何在保持与iOS 9的兼容性的同时将其转换。
我粘贴下面的代码,由Xcode转换。 您可以在https://github.com/entotsu/TKSubmitTransition/blob/master/SubmitTransition/Classes/NSTimerEx.swiftfind原始代码
干杯
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 } }
尝试像这样:
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 } }