Swift - 结构体还是字典

3
通常情况下,当存储字典风格的结构化数据时,例如:
let menuItems = [
    [
        "title": "View Profile",
        "icon": "iconSideProfile"
    ],
    [
        "title": "Invite Friends",
        "icon": "iconSideHeart"
    ],
    [
        "title": "Settings",
        "icon": "iconSideSettings"
    ],
    [
        "title": "Help",
        "icon": "iconSideHelp"
    ],
    [
        "title": "Logout",
        "icon": "iconSideLogout"
    ]
]

我们有一个包含标题和图标的字典数组,是将这些字典存储为字典还是结构体更好的做法?

struct MenuItem {
    let title: String
    let icon: String
}

let menuItems = [
    MenuItem(title: "View Profile", icon: "iconSideProfile"),
    ...
]

使用struct存储的优点是数据更好地定义,这意味着在某些情况下你不必明确地指定字典将包含哪个键等。

但这是否会浪费资源呢?


1
你为什么认为使用结构体比使用字典更浪费资源?更浪费哪些资源? - Scott Hunter
我猜结构体的使用比字典更费内存资源,因此开销更大。或者它们是类似的吗? - DJDMorrison
2
在字典中,你为每个菜单项存储了4个字符串。使用结构体,则每个菜单项只需要2个字符串即可。你应该明确地在这里使用“struct”,不仅是为了更有效地利用内存,也是因为它是更强类型的选择。 - Hamish
2
在这个例子中并不是很明显(@Hamish 给出了正确的答案),但在其他情况下,当你处理键值数据时,也可以考虑使用自定义的 enum 作为键,而不是使用 String。强类型而不是字符串类型。 - Alan Kantz
2个回答

3
是的,使用数据结构(struct或class)总是更好的选择。使用字典容易出错,会占用更多的内存和CPU时间,在软件运行并崩溃时需要花费大量的人力寻找和修复错误。变量名称中的拼写错误会被编译器捕捉到,但作为字典键使用的字符串的拼写错误只会在软件运行时导致奇怪的错误,并且有时这些错误会在你离开后很长一段时间才出现,使得某个可怜的人不得不维护这段代码。
当你有很多不同且通常是不可预测的字符串作为键时,可以使用字典。但如果你一遍又一遍地使用相同的两个字符串,并且它们永远不会改变,那么没有理由不使用struct或class,而且使用像你在问题中展示的字典是明显的糟糕代码,应该尽量避免。"最初的回答"

这并不完全正确,使用结构体会使用更多的内存和CPU,因为需要在堆栈方法之间进行复制。但是,字典读取速度较慢,因为需要从堆中访问。这就是权衡。 - Alex Bin Zhao
@Alex Bin Zhao,使用字典是一种不好的技术,会导致错误。我亲身经历过这种情况,之前有一个懒惰的程序员几乎为所有事情都使用了字典,而且在添加到字典中时就已经“定义”了数据。如果他们使用了常量,至少可以避免拼写错误导致的错误。 - David Rector
由于字典没有定义且可以在多个地方添加条目,因此调试任何代码的唯一方法是搜索每个字典的“添加”调用,并查看是否针对该字典并使用正确拼写的键。我坚持认为,在预定数据中使用字典是可怕的编程技术,使用结构体或类同样适用。如果性能是问题,请不要通过值传递结构体,而应传递引用! - David Rector

3

仅澄清一点,当您使用 struct 时担心内存资源的问题。结构是值复制传递类型。它不像类(引用类型)那样存储在内存堆中。

所以放心使用 struct,这是由苹果公司自己推荐的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接