为了账号安全,请及时绑定邮箱和手机立即绑定

为什么选择结构而不是班级?

为什么选择结构而不是班级?

DIEA 2019-07-03 11:04:58
为什么选择结构而不是班级?玩SWIFT,来自Java背景,你为什么要选择一个Struct而不是一个类呢?看起来他们是一样的东西,结构提供较少的功能。那为什么要选呢?
查看完整描述

3 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

根据非常流行的WWDC 2015对话协议编程,在SWIFT(视频成绩单),SWIFT提供了许多特性,使结构在许多情况下优于类。

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

有了Structs,就不需要担心内存泄漏或多线程争先恐后地访问/修改变量的单个实例了。(对于技术上来说,这方面的例外是在闭包中捕获一个结构,因为它实际上是捕获对实例的引用,除非您显式地标记为要复制它)。

类也可能膨胀,因为类只能从单个超类继承。这鼓励我们创建巨大的超类,包含许多不同的能力,而这些能力只是松散相关的。使用协议,特别是与协议扩展一起使用协议,可以为协议提供实现,从而消除了类来实现此类行为的需要。

讨论中列出了一些首选类的场景:

  • 复制或比较实例没有意义(例如,窗口)
  • 实例生存期与外部影响相关联(例如,TemporaryFile)
  • 实例只是“接收器”-只写到外部状态的管道(例如CGContext)。

这意味着结构应该是默认的,类应该是备用的。

另一方面,SWIFT编程语言文件有些矛盾:

结构实例总是通过值传递,类实例总是通过引用传递。这意味着它们适合于不同类型的任务。在考虑项目所需的数据结构和功能时,请确定每个数据结构应该定义为类还是结构。

作为一般指导方针,考虑在下列一个或多个条件适用时创建一个结构:

  • 该结构的主要目的是封装一些相对简单的数据值。
  • 在分配或传递该结构的实例时,可以合理地预期封装的值将被复制,而不是引用。
  • 结构存储的任何属性本身都是值类型,它们也将被复制而不是引用。
  • 该结构不需要从另一个现有类型继承属性或行为。

良好的结构候选例子包括:

  • 几何形状的大小,可能封装了一个宽度属性和一个高度属性,两者都属于Double类型。
  • 一种在系列中引用范围的方法,可能会封装Int类型的Start属性和Length属性。
  • 三维坐标系中的一个点,可能封装了x、y和z的属性,每个属性都是Double类型的。

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

在这里,它声称我们应该默认使用类,并且只在特定的情况下使用结构。最终,您需要了解值类型与引用类型的真实含义,然后您可以对何时使用结构或类做出明智的决定。此外,请记住,这些概念一直在发展,SWIFT编程语言文档是在面向协议的编程演讲之前编写的。


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 472 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信