我在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]()

我正在努力决定哪种方法更好.将数组声明为可选数组意味着它根本不会占用任何内存,而空数组至少为其分配了一些内存,对吗?因此,使用可选数组意味着至少可以节省一些内存.我想我的第一个问题是:这里真的有任何实际的内存节省,或者我对这一点的假设是错误的吗?

另一方面,如果它是可选的,那么每次try 使用它时,我都必须在添加或删除对象之前判断它是否为nil.因此,那里会有一些效率损失(但我想不会太多).

我有点喜欢可选的方法.并不是每Person人都会有子元素,所以为什么不让children人成为nil人,直到Person人决定安定下来并养育一个家庭?

无论如何,我想知道一种方法或另一种方法是否还有其他特定的优点或缺点.这是一个会反复出现的设计问题.

推荐答案

在空数组或可选数组之间进行 Select 的能力使我们能够应用从语义Angular 更好地描述数据的array.

我会 Select :

  • 一个空数组,如果列表可以为空,但它是一个暂时状态,最后它应该至少有一个元素.非可选性表明数组不应为空
  • 如果列表在容器实体的整个生命周期内可能为空,则为可选.如果是可选的,则表明数组可以为空

让我举几个例子:

  • 带有主数据和详细信息的采购订单(每个产品一个详细信息):一个采购订单可以有0个详细信息,但这是一个暂时状态,因为拥有一个带有0个产品的采购订单是没有意义的
  • 有子元素的人:一个人一生不能有子元素.这不是一种暂时的状态(虽然也不是永久的),但使用可选状态很明显,一个人没有子元素是合法的.

请注意,我的观点只是让代码更加清晰和self 解释——我认为在 Select 一个选项或另一个选项时,在性能、内存使用等方面没有任何显著差异.

Swift相关问答推荐

Swift concurrency reload/await,支持只执行成功并重试

如何将EnvironmentObject从UIKit视图控制器传递到SwiftUI视图

减go 用SWIFT struct 填充的NSCountedSet

ARRaycast Query和前置摄像头(ARFaceTrackingConfiguration)

Swift ui 转换无法按预期工作

Swift数据关系

在 Swift 5.7 中使用协议作为类型时什么时候需要写 `any`

If 语句在 Swift 中有 2 个日期

PassthroughSubject 的 AsyncPublisher 值属性未生成所有值

如何从 Swift 中隐藏 Objective-C 类接口的一部分?

如何在 SceneKit 上制作毛玻璃效果

为什么 id 不能通过 struct 从 Objective-C 移植到 Swift?

如果 Swift 无法分配内存会怎样?

UUID 哈希值是不确定的吗?

在 SwiftUI 中的 ForEach 中使用 id 时如何为数组设置动画索引

Xcode 13.3 将函数调用更改为属性访问

在 Swift 4 中实现自定义解码器

AES 加密和解密

Swift 覆盖实例变量

如何在swift中的每N个字符处为字符串添加分隔符?