swift – 你能装饰一个破坏调试的函数来代替调用该函数的位置吗?

swift – 你能装饰一个破坏调试的函数来代替调用该函数的位置吗?,第1张

概述最好用一个例子来解释.考虑一下这个mustOverride辅助函数: func mustOverride(callSite:String = #function) -> Never { preconditionFailure("\(callSite) must be overridden in a subclass")} 我们使用它来制作虚假抽象类,如下所示: // Faux 'abst 最好用一个例子来解释.考虑一下这个mustOverrIDe辅助函数:

func mustOverrIDe(callSite:String = #function) -> Never {    preconditionFailure("\(callSite) must be overrIDden in a subclass")}

我们使用它来制作虚假抽象类,如下所示:

// Faux 'abstract' classclass SoundBase {    func play(){        mustOverrIDe()    }}// 'Concrete' classclass CatSound : SoundBase {    overrIDe func play(){        // play cat 'meow' sound    }}

如上所述,如果直接实例化SoundBase并调用play(),则会触发mustOverrIDe()函数,该函数在可调试状态下中断.问题是它在mustOverrIDe()函数内断开,而不是在调用站点play().

Microsoft的.NET有一个简洁的功能,您可以使用属性来修饰函数,以更改它们与调试器的交互方式(see here了解更多信息).

例如,它们有一个DeBUGgerHIDden属性,如果应用于mustOverrIDe(),会导致调试器在调用play()函数内部而不是在mustOverrIDe()内部,这样可以避免不必要的调用栈之类的 *** 作.上一层找出错误的真正位置.

我想知道Swift是否有类似这种能力的东西.如果使用得当,它真的很棒.

解决方法 假设您正在使用Xcode进行调试,那么您要查找的是 @_transparent属性.这是在行动:

@_transparentfunc 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 – 你能装饰一个破坏调试的函数来代替调用该函数的位置吗?全部内容,希望文章能够帮你解决swift – 你能装饰一个破坏调试的函数来代替调用该函数的位置吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1003226.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存