我正在尝试在Swift 3中扩展Foundation的Timer
类,添加一个方便的初始化程序。但是它对Foundation提供的初始化程序的调用永远不会返回。
以下是一个可以作为Playground运行的简单演示,展示了这个问题。
import Foundation
extension Timer {
convenience init(target: Any) {
print("Next statement never returns")
self.init(timeInterval: 1.0,
target: target,
selector: #selector(Target.fire),
userInfo: nil,
repeats: true)
print("This never executes")
}
}
class Target {
@objc func fire(_ timer: Timer) {
}
}
let target = Target()
let timer = Timer(target: target)
控制台输出:
下一个语句永远不会返回
为了进一步研究,
• 我编写了类似的代码来扩展URLProtocol
(只有少数几个其他基础类之一具有实例初始化器)。结果:没有问题。
• 为了排除Objective-C作为可能的原因,我将包装的初始化器更改为init(timeInterval:repeats:block:)
方法,并提供了一个Swift闭包。结果:同样的问题。
timerWithTimeInterval:target:selector:userInfo:repeats:
)导入的,该方法仅返回NSTimer
实例(因此无法用于创建子类实例)。虽然我不知道为什么这会使它无限递归(使用自己的Obj-C工厂方法无法复现),因此可能是NSTimer
实现中的某些问题。非常奇怪。 - Hamish