小心:外行的条件在前面。
在最严格的代码级别上,这种解释并不十分正确。但是,已经有一个实际从事Swift的人对它进行了审查,他说这足以作为基本的解释。
因此,我想尝试简单直接地回答“为什么”的问题。
准确地说:当我们可以在不修改任何关键字的情况下更改结构参数时,为什么还要将结构函数标记为mutating
?
因此,总的来说,这与保持Swift 迅速发展的哲学息息相关。
您可能会认为它类似于管理实际物理地址的问题。更改地址时,如果有很多人拥有您的当前住所,则您必须通知所有住所。但是,如果没有人知道您的当前地址,那么您可以将其移至所需的任何地方,而无需知道。
在这种情况下,Swift有点像邮局。如果很多人有很多联系,四处走动,这将带来很大的开销。它必须支付大量人员来处理所有这些通知,并且该过程占用大量时间和精力。这就是为什么Swift的理想状态是让镇上的每个人都尽可能少地联系。然后,它不需要大量人员来处理地址更改,并且它可以更快,更好地完成其他所有工作。
这也是为什么Swift-Folks都热衷于值类型与引用类型的原因。从本质上讲,引用类型遍布整个地方的“联系”,而值类型通常不需要几个。值类型为“ Swift” -er。
所以回到小图片:structs
。在Swift中,结构很重要,因为结构可以执行对象可以执行的大多数操作,但是它们是值类型。
让我们通过想象一个misterStruct
存在于中的物理地址来继续类比someObjectVille
。这里的类比有点奇怪,但我认为它仍然很有帮助。
因此,要为在上更改变量的模型建模struct
,假设它misterStruct
有绿色的头发,并获得切换为蓝色头发的命令。就像我说的那样,这个比喻有点眨眼,但是发生的事情是,misterStruct
老人不再换头发,而是搬走了,而一个留着蓝色头发的新人进入了,那个新人开始自称misterStruct
。无需更改地址通知,但如果有人查看该地址,他们会看到一个蓝头发的家伙。
现在,让我们对在上调用函数时的情况进行建模struct
。在这种情况下,就像misterStruct
获得了诸如这样的订单changeYourHairBlue()
。因此,邮局发出的指示是misterStruct
“将头发变成蓝色,并在完成后告诉我”。
如果他遵循与以前相同的例程,并且如果他正在做的操作(直接更改变量时),那么misterStruct
要做的就是搬出自己的房子,并召集一个有着蓝色头发的新人。但这就是问题所在。
命令是“把头发变成蓝色,然后告诉我完成的时间”,但是得到命令的是绿色人。蓝色家伙进入后,仍然必须发送回“作业完成”通知。但是这个蓝家伙对此一无所知。
[为了使这个比喻真正令人震惊,从技术上讲,绿头发的家伙搬出去后立即自杀。因此,他也无法通知任何人任务已完成!]
为了避免这个问题,仅在这种情况下,Swift必须直接进入该地址处的房子,并实际上要更改当前居民的头发。这与发送新人完全不同。
这就是为什么Swift希望我们使用mutating
关键字!
最终结果对于必须引用该结构的任何事物而言都是相同的:房屋的居民现在已经染成蓝色。但是实现它的过程实际上是完全不同的。看起来它在做同一件事,但是在做另一件事。它所做的事情通常是Swift结构永远不会做的。
因此,要给性能不佳的编译器一些帮助,而不必让它不得不找出某个函数是否对每个struct函数都struct
自行进行了突变,我们就必须感到遗憾并使用该mutating
关键字。
本质上,要帮助Swift保持敏捷,我们都必须尽自己的一份力量。:)
编辑:
嘿小伙子/ dudette否决了我,我只是完全重写了我的回答。如果情况更好,您是否会删除弃权票?