便利な初期化子を追加して、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 クラスの 1 つ)。結果:問題ありません。
• 考えられる原因として Objective-C のものを排除するために、ラップされたイニシャライザをinit(timeInterval:repeats:block:)
メソッドに変更し、Swift クロージャを提供しました。結果: 同じ問題。