gpt4 book ai didi

swift - 你能装饰一个破坏调试的函数,而不是在调用该函数的地方中断吗?

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:04 24 4
gpt4 key购买 nike

这最好用一个例子来解释。考虑这个 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() 内部中断 函数和 notmustOverride() 中,这可以让您避免不必要的调用堆栈之旅,只是为了返回一级以找出错误的真正位置。

我想知道 Swift 是否有类似的功能。如果使用得当,它真的很棒。

最佳答案

假设您在 Xcode 中进行调试,您正在寻找的是 @_transparent属性。这是实际操作:

@_transparent
func mustOverride(callSite: String = #function) -> Never {
preconditionFailure("\(callSite) must be overridden in a subclass")
}

class SoundBase {
func play(){
mustOverride()
}
}

class CatSound: SoundBase {
override func play() {}
}

SoundBase().play()

结果:

来自文档:

Semantically, @_transparent means something like "treat this operation as if it were a primitive operation". The name is meant to imply that both the compiler and the compiled program will "see through" the operation to its implementation.

注意:

  • 由于@_transparent以下划线开头,以后可能会改变

关于swift - 你能装饰一个破坏调试的函数,而不是在调用该函数的地方中断吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50164871/

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