【问题标题】:Best Practices: description vs debugDescription最佳实践:description vs debugDescription
【发布时间】:2017-08-11 21:45:07
【问题描述】:

标题:super.init()调用的描述

这是对旧问题的新看法。作为一个主要的 Swift 程序员,我倾向于不使用 NSObject 来定义类,因为 Objective-C 的残余副作用。就像如果我有一个名为 length 的只读属性,然后我想创建一个名为 setLength 的 setter 函数,我会收到有关它与 Objective- 中的类似定义冲突的警告 - C。我刚刚发现了 set(var){} 设置器。如果我将继承自 NSObject 的 Cacoa 类(如 UIDocument 等)子类化,我必须忍受这些副作用。

我有一个在属性定义中使用其他两个类的类,它们都不是 NSObjects。该类有一个 description 计算变量,该变量使用 description 计算变量用于其组成中的其他两个类。所有三个类都需要符合 CustomStringConvertable 协议。好的,一切都很好。

在某些时候,此类升级为 UIDocument,而 CustomStringConvertable 变得多余并被删除。一切仍然有效。

这是我今天发现的。我想在程序中打印两个属性之一的地方打断,为了方便起见,我在该类的描述变量中设置了断点,认为它应该只在我感兴趣的地方调用,打印出来的地方。我发现在 UIDocument 子类的所有 super.init() 过程中都会调用描述变量!其中有几个。我认为组合字符串相对昂贵,但并不在意,因为它们仅用于调试,但随着它们被调用并且谁知道它们在 super.init() 中如何使用,我需要更改它。

我在同一个程序中检查了另一个 UIDocument 类,它有 200 个与之关联的文件,它还在 super.init() 中调用描述。

是否有人对使用 descriptiondebugDescription 的最佳实践有任何意见?

我将根据文档回答我自己的问题。

【问题讨论】:

    标签: swift cocoa


    【解决方案1】:

    我切换了 UIDocuments 子类来定义和使用 debugDescription。我正在调试一些加载所有文件并进行一些操作的代码,我能够将加载时间从 9.8 秒减少到 6.8 秒。

    我还浏览了 Swift 3 转换添加 String(describing:) 到程序的所有地方,发现我可以将其中的很多地方改为使用 debugDescription并消除 String(describing:) 包装器。

    我认为最好的做法是只定义和使用 debugDescription 并且对于我的非 NSObjects 将一致性从 CustomStringConvertable 更改为 CustomDebugStringConvertable。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2011-05-12
      • 2010-10-04
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多