【发布时间】:2015-01-04 20:48:42
【问题描述】:
我在 Swift 中有一个简单的 Person 类,看起来像这样:
class Person {
var name = "John Doe"
var age = 18
var children = [Person]?
\\ init function goes here, but does not initialize children array
}
不用将children 声明为可选数组,我可以简单地声明它并将其初始化为一个空数组,如下所示:
var children = [Person]()
我正在尝试决定哪种方法更好。将数组声明为可选数组意味着它根本不会占用任何内存,而空数组至少分配了一些内存,对吗?所以使用可选数组意味着至少会节省一些内存。我想我的第一个问题是:这里真的有任何实际的内存节省,还是我对此的假设不正确?
另一方面,如果它是可选的,那么每次我尝试使用它时,我都必须在添加或删除对象之前检查它是否为nil。所以会有一些效率损失(但我想不会很多)。
我有点喜欢可选的方法。不是每个Person 都会有孩子,所以为什么不让children 成为nil,直到Person 决定安定下来养家糊口?
无论如何,我想知道一种方法是否有其他特定的优点或缺点。这是一个反复出现的设计问题。
【问题讨论】:
-
你有一个有效的问题,但我认为赞成和反对的论点是危险的——基于过早的优化而不是语义。关注代码的“可供性”要好得多——它在多大程度上暗示了意图(无论上下文可能是什么)。 Swift 有很多我不喜欢的地方,但对我来说, Optional 类型是一个真正的宝石。虽然您的问题没有“正确”的答案,但我在像您这样的情况下广泛使用它。在可选子项的情况下使用可选项似乎完全合理且极简。
-
我会假设数组中的项目数为零意味着有零个孩子。一个 nil 数组表明存在多个不能为零且不能为非零的子级。返回 nil 没有逻辑,因为它没有任何意义。由于必须维护 20 年前编写的代码,我可以告诉您,如果您通过返回 nil 来暗示其他含义,那么有些人会对此感到困惑,并想知道您打算如何处理空数组没有的 nil完成。空数组的性能可能并不重要。