猿问

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

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

玩SWIFT,来自Java背景,你为什么要选择一个Struct而不是一个类呢?看起来他们是一样的东西,结构提供较少的功能。那为什么要选呢?



DIEA
浏览 512回答 3
3回答

慕容森

根据非常流行的WWDC 2015对话协议编程,在SWIFT(视频, 成绩单),SWIFT提供了许多特性,使结构在许多情况下优于类。如果结构相对较小且可复制,则结构更可取,因为复制比对同一个实例的多个引用要安全得多,就像类一样。在将变量传递给许多类和/或多线程环境中时,这一点尤为重要。如果您总是可以将变量的副本发送到其他地方,则不必担心另一个地方更改您下面变量的值。有了Structs,就不需要担心内存泄漏或多线程争先恐后地访问/修改变量的单个实例了。(对于技术上来说,这方面的例外是在闭包中捕获一个结构,因为它实际上是捕获对实例的引用,除非您显式地标记为要复制它)。类也可能膨胀,因为类只能从单个超类继承。这鼓励我们创建巨大的超类,包含许多不同的能力,而这些能力只是松散相关的。使用协议,特别是与协议扩展一起使用协议,可以为协议提供实现,从而消除了类来实现此类行为的需要。讨论中列出了一些首选类的场景:复制或比较实例没有意义(例如,窗口)实例生存期与外部影响相关联(例如,TemporaryFile)实例只是“接收器”-只写到外部状态的管道(例如CGContext)。这意味着结构应该是默认的,类应该是备用的。另一方面,SWIFT编程语言文件有些矛盾:结构实例总是通过值传递,类实例总是通过引用传递。这意味着它们适合于不同类型的任务。在考虑项目所需的数据结构和功能时,请确定每个数据结构应该定义为类还是结构。作为一般指导方针,考虑在下列一个或多个条件适用时创建一个结构:该结构的主要目的是封装一些相对简单的数据值。在分配或传递该结构的实例时,可以合理地预期封装的值将被复制,而不是引用。结构存储的任何属性本身都是值类型,它们也将被复制而不是引用。该结构不需要从另一个现有类型继承属性或行为。良好的结构候选例子包括:几何形状的大小,可能封装了一个宽度属性和一个高度属性,两者都属于Double类型。一种在系列中引用范围的方法,可能会封装Int类型的Start属性和Length属性。三维坐标系中的一个点,可能封装了x、y和z的属性,每个属性都是Double类型的。在所有其他情况下,定义一个类,并创建要通过引用管理和传递的该类实例。实际上,这意味着大多数自定义数据构造应该是类,而不是结构。在这里,它声称我们应该默认使用类,并且只在特定的情况下使用结构。最终,您需要了解值类型与引用类型的真实含义,然后您可以对何时使用结构或类做出明智的决定。此外,请记住,这些概念一直在发展,SWIFT编程语言文档是在面向协议的编程演讲之前编写的。
随时随地看视频慕课网APP
我要回答