【发布时间】:2016-12-24 19:48:11
【问题描述】:
我正在尝试在 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(仅有的具有实例初始化程序的其他Foundation 类之一)。结果:没问题。
• 为了消除可能导致 Objective-C 的东西,我将包装的初始化程序更改为 init(timeInterval:repeats:block:) 方法并提供了一个 Swift 闭包。结果:同样的问题。
【问题讨论】:
标签: swift timer swift3 initializer convenience-methods