无法将 (Timer!) -> Void 转换为 ((CFRunLoopTimer?) ->Void)! - 将 NSTimer 扩展转换为 Swift 3
Cannot convert (Timer!) -> Void to ((CFRunLoopTimer?) ->Void)! - Converting NSTimer extension to Swift 3
我正在尝试将我在我的项目中使用的 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
}
}
这样试试:
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
}
}
我正在尝试将我在我的项目中使用的 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
}
}
这样试试:
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
}
}