我正在尝试Timer
在 Swift 3 中扩展 Foundation 的类,添加一个便利的初始化程序。但它对 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
(仅有的具有实例初始化程序的其他 Foundation 类之一)。结果:没问题。
• 为了消除可能导致Objective-C 的东西,我将包装的初始化程序更改为init(timeInterval:repeats:block:)
方法并提供了一个Swift 闭包。结果:同样的问题。