当前位置: 首页 > 知识库问答 >
问题:

为什么选择结构而不是类?

濮阳立果
2023-03-14

在使用来自Java背景的Swift时,为什么要选择结构而不是类呢?似乎它们是一样的,结构提供的功能较少。那为什么选择它呢?

共有1个答案

郦兴德
2023-03-14

根据Swift中非常流行的WWDC 2015 talk Protocol Oriented Programming(video,transcript),Swift提供了许多特性,使结构在许多情况下优于类。

如果结构相对较小且可复制,则结构更好,因为复制比使用类时对同一个实例进行多个引用要安全得多。当将一个变量传递给许多类和/或在多线程环境中时,这一点尤其重要。如果您可以将变量的副本发送到其他地方,那么您就不必担心其他地方会改变您下面变量的值。

使用结构,不必担心内存泄漏或多个线程竞相访问/修改变量的单个实例。(对于更有技术头脑的人来说,这种情况的例外是在闭包中捕获结构,因为它实际上是在捕获对实例的引用,除非您显式地将其标记为要复制)。

演讲列出了首选类的这些场景:

  • 复制或比较实例没有意义(例如,窗口)
  • 实例生存期与外部效果(例如,TemporaryFile)
  • 实例只是“接收器”--只写外部状态(例如cgcontext)的管道

它意味着结构应该是默认的,类应该是后备的。

    null
    null

在所有其他情况下,定义一个类,并创建要通过引用管理和传递的该类的实例。实际上,这意味着大多数自定义数据构造应该是类,而不是结构。

在这里,它声称我们应该默认使用类,只在特定的情况下使用结构。最终,您需要理解值类型与引用类型在现实世界中的含义,然后您就可以对何时使用结构或类做出明智的决定。此外,请记住,这些概念总是在不断发展,而且Swift编程语言文档是在给出面向协议的编程讨论之前编写的。

 类似资料:
  • 问题内容: 在Java背景下玩Swift,为什么要选择Struct而不是Class?似乎它们是同一回事,但Struct提供的功能较少。为什么选择它呢? 问题答案: 根据非常流行的WWDC 2015演讲《 Swift中的面向协议的编程》(视频,成绩单),Swift提供了许多功能,这些功能在许多情况下都比类更好。 如果结构相对较小且可复制,则结构是可取的,因为与在类中多次引用相同实例相比,复制要安全得

  • 本文向大家介绍为什么选择茉莉而不是开玩笑是什么原因?,包括了为什么选择茉莉而不是开玩笑是什么原因?的使用技巧和注意事项,需要的朋友参考一下 没有充分的理由选择茉莉而不是开玩笑。两者都是优秀的库,已经存在了一段时间,并且以一种自以为是的方式来处理非常相似的事情。笑话是建立在茉莉花之上的。 选择茉莉而不是开玩笑的原因之一是它更快。(https://github.com/facebook/jest/is

  • 问题内容: 使用代替或的优点是什么? 问题答案: Thread和Runnable是Java 1.0的一部分;他们和当时一样出色。 从那时起,新的并发类将提炼出关于多线程的所有知识(感谢您,Doug Lea和其他人)。编写多线程代码非常困难。包括SwingWorker在内的新的并发类都试图使其变得更容易。 首先请注意用于强类型键入的泛型。有内置的机制可以发布和处理最终结果和中间结果。 可以使用Thr

  • 问题内容: 流式XML解析器(例如SAX和StAX)比构建像DOM解析器之类的树结构的解析器更快,内存效率更高。SAX是推送分析器,这意味着它是观察者模式(也称为侦听器模式)的实例。SAX首先出现,然后是StAX- 拉式解析器,这意味着它基本上像迭代器一样工作。 您可以找到在任何地方都偏爱StAX而不是SAX的原因,但是通常可以归结为:“更易于使用”。 在JAXP上的Java教程中,StAX被模糊

  • 问题内容: 来自python Wiki 多元元组 在Python中,多元元组看起来像: … 但是,再次定义元组的是逗号而不是括号。 真的吗?! 那么为什么: 更严重的是,我不明白为什么不选择括号而不是逗号? 因为我认为在以下情况下会产生悖论: 但是,如果您认为圆括号 总是 负责实例化a ,那么用多个项目实例化的所有问题 都消失了。 例如在我的想象世界中: 我知道这是一个众所周知的功能,如果已经重复