gpt4 book ai didi

swift 3 : Convenience Initializer Extending Foundation's 'Timer' Hangs

转载 作者:搜寻专家 更新时间:2023-10-31 22:05:33 26 4
gpt4 key购买 nike

我正在尝试在 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)

控制台输出:

Next statement never returns

进一步研究,

• 我编写了扩展URLProtocol 的类似代码(仅有的其他具有实例初始化程序的基础类之一)。结果:没问题。

• 为了消除 Objective-C 的可能原因,我将包装的初始化程序更改为 init(timeInterval:repeats:block:) 方法并提供了一个 Swift 闭包。结果:同样的问题。

最佳答案

我实际上并不知道答案,但我在带有调试器的实际应用程序中运行它时发现存在无限递归(因此挂起)。我怀疑这是因为您实际上并未调用 Timer 的指定初始值设定项。这个事实并不明显,但是如果您尝试子类化 Timer 并调用 super.init(timeInterval...) 编译器会报错,而且 上还有一个奇怪的“未继承”标记标题中的 super.init(timeInterval...)

我能够通过调用 self.init(fireAt:...) 来解决这个问题:

extension Timer {
convenience init(target: Any) {
print("Next statement never returns") // but it does
self.init(fireAt: Date(), interval: 1, target: target,
selector: #selector(Target.fire), userInfo: nil, repeats: true)
print("This never executes") // but it does
}
}

随心所欲...

关于 swift 3 : Convenience Initializer Extending Foundation's 'Timer' Hangs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41316396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com