【发布时间】:2018-10-14 08:20:50
【问题描述】:
最好用一个例子来解释。考虑这个mustOverride 辅助函数:
func mustOverride(callSite:String = #function) -> Never {
preconditionFailure("\(callSite) must be overridden in a subclass")
}
我们用它来制作虚假的抽象类,如下所示:
// Faux 'abstract' class
class SoundBase {
func play(){
mustOverride()
}
}
// 'Concrete' class
class CatSound : SoundBase {
override func play(){
// play cat 'meow' sound
}
}
通过上述方式,如果您直接实例化SoundBase 并调用play(),您将触发mustOverride() 函数,该函数在可调试状态下中断。问题是它在mustOverride() 函数内部中断,而不是在调用站点play()。
Microsoft 的 .NET 有一个简洁的功能,您可以使用属性装饰函数以更改它们与调试器的交互方式(see here 了解更多信息)。
例如,它们有一个DebuggerHidden 属性,如果将其应用于mustOverride(),将导致调试器改为在调用play() 函数内部中断,而不 在mustOverride() 内部中断为您节省了不必要的调用堆栈之旅,只是为了备份一个级别以找出错误的真正位置。
我想知道 Swift 是否有类似的功能。使用得当真的很棒。
【问题讨论】:
-
我假设在 mustOverride() 中抛出错误并在 play() 中捕获它不适用于您的情况?
-
不,这与错误或在运行时捕获它无关。这是关于调试时的调用堆栈,并且希望始终忽略最后一帧并转到前一帧。希望这是有道理的。
标签: swift debugging swift4 callstack