. Я пытаюсь расширить класс Foundation Timer
в Swift 3, добавив инициализатор удобства. Но его призыв к инициализатору, предоставленному Фондом, никогда не возвращается.Swift 3: Инициализатор удобства. Расширение «Timer» веток Foundation.
Проблема проиллюстрирована в следующей тривиализованной демонстрации, которая может быть запущена в качестве игровой площадки.
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)
Консоли вывод:
Next statement never returns
Для дальнейшего изучения,
• Я написал подобный код, проходящий URLProtocol
(один из единственных других классов Foundation с экземпляром инициализатором). Результат: Нет проблем.
• Чтобы устранить объект Objective-C как возможную причину, я изменил обернутый инициализатор на init(timeInterval:repeats:block:)
и предоставил быструю закрытие. Результат: та же проблема.
«Не наследуемая» маркировка в заголовке означает, что она не может использоваться в качестве инициализатора для подкласса из-за того, что она импортируется из фабричного метода Obj-C ('timerWithTimeInterval: target: selector: userInfo : repeat: '), который возвращает только экземпляры NSTimer (таким образом, не может использоваться для создания экземпляра подкласса). Хотя я не понимаю, почему это должно сделать это бесконечно рекурсивно (не может воспроизвести мой собственный метод фабрики Obj-C), поэтому, вероятно, что-то в реализации NSTimer делает это. Самое своеобразное. – Hamish