类或结构-这是问题吗?

众所周知,设计应用程序中最重要的步骤是DataModel的定义。

这个阶段需要大量关注和长时间,因为这是我们项目的逻辑,核心,在此阶段做出的决定可能会影响我们代码的速度,可持续性和可重用性。

我记得对于与我的队友Giacomo和Jippe一起进行的最新Apple iOS开发人员学院项目,我们花了3个多星期才发布第一版。

当您开始设计它时,情况似乎并没有那么糟。
关键时刻到了,您必须创建第一个对象。
这就是两难的原因:

类还是结构?

可以在网上找到成千上万的文章。
每个人都通过重复通常的概念以及类和结构之间的通常差异来作出响应,而没有根据我们的需要解释何时使用一种而不是另一种有用。

答案总是相同的,并且倾向于强调两者之间的差异,它们并不能真正帮助我们选择对我们的案例最有用的一个

例如:

1.继承

类具有继承。 结构没有。

因此,如果需要对结构进行子类化,唯一的解决方案是将其转换为类。

2.价值和参考语义

类使用语义参考。

当等距分配给变量或函数时,它们指的是同一现有实例。

例如:

如您所见,创建新变量并不意味着创建新对象。

通过视图所做的更改也可以从view2中看到,因为它们引用了内存中的同一对象。

关于不可变性的观察:

如您所见, viewview2都被声明为let,因此它们都是constant
但是,为什么可以在类中更改值而不用编译器抱怨呢?

类是引用类型,因此可以暗示在程序执行期间,所指向的存储区域(即地址)不变。 您可以使用var和let控制类中的可变属性和不可变属性。

结构使用值语义。

当将值类型的对象分配给变量或传递给函数时,编译器将复制该对象。

实际上,只要不修改对象,它们就与同一对象相关。 发生更改时,编译器将进行复制。 这种技术称为写时复制。

例如:

在发生更改之前,string1和string2是相同的实体

编辑string2,强制编译器创建原始对象的副本。

关于不可变性的观察:

尝试将string2var更改为let

您会注意到编译器会抱怨,因为您已将结构声明为常量 ,并且试图更改其内部状态。

它们的行为不像类。

结构具有语义值,如果声明为let,则不能更改结构中的任何属性。
对于声明为var的结构,您可以在初始化后更改,将所有内部属性定义为var。

但是……这些解释可以帮助我们解决难题吗?

没有! 我认为,所有这些答案都无法阐明选择为特定实体创建类或结构所引起的疑问。

很多时候,我开始考虑这种选择似乎天天琐事。
终于,我找到了解决这个难题的办法!

平等的概念

那些了解我的人都非常清楚,我喜欢通过使用现实生活中的示例来解释概念,然后将其与实际的示例进行比较。

每当我们遇到这种选择, 类或结构时 ,请问自己:

“当两个物体相同时?”

首先,这个问题的答案似乎微不足道,但事实并非如此。
让我用两个示例向您解释原因:

第一个例子:

假设您和朋友一起在酒吧里,并且必须支付账单

50美元调酒师大叫

您和所有朋友一样, 将钞票从钱包中拉出 ,坐在柜台上。
您的一位朋友决定付清全部账单, 然后您取回了这笔钱。

如果没有意识到这一点, 您可以收回50美元,但那不完全是您获得的50美元 。 这对您来说并不重要,您可以开心回家。

尽管初始纸币和最终纸币不同, 但它们的价值相同

两者都值50美元 ,对您来说是同一回事。

在这种情况下,价值是最重要的

第二个例子:

我们有两个双胞胎, 鲍勃亚历克斯
鲍勃是个非常坚强的足球运动员,亚历克斯是个厨师

您决定参加足球比赛,并且想赢。
鲍勃和亚历克斯等于外表,但并不相同
为了有更多机会赢得比赛, 您想加入Bob,而不是Alex

鲍勃和亚历克斯虽然是双胞胎, 却不是一回事
身份至关重要。