继续这个问题:为什么Swift数组赋值不一致(既不是引用也不是深复制)? -
我一直在尝试在Swift中传递对象并注意到一些奇怪的结果。
为了澄清我之前(在Swift之前)所熟悉的行为,举个例子,在我的一个应用程序中(用Obj C编写),我有一个“通知列表”的概念。 - 实际上只是自定义对象的数组。
在该应用程序中,我经常将全局“通知”数组传递给各种视图控制器,这些视图控制器提供UI以更新列表。
当我将全局数组传递给子视图控制器时,我将其分配给接收对象中的本地数组变量。然后,通过更新/更改本地数组,这些更改会反映在根视图控制器上的全局数组中。我理解这种行为在Objective C中是隐含的,因为对象是按引用传递的,但这真的很方便,我一直在尝试在Swift中复制这种行为。
然而,当我在Swift中重写我的应用程序时,我遇到了问题。
我首先尝试从rootViewController传递一个Swift字符串数组(而不是NSMutableArray)到子视图控制器(如上所述)。
当将字符串数组传递给子视图控制器时,其行为如下:
我传入:
[Bill,Bob,Jack] 然后将此传递的数组分配给本地数组以进行本地修改,
然后我将字符串“Frank”附加到本地数组
结果是:
本地数组 = [Bill,Bob,Jack,Frank]
全局数组 = [Bill,Bob,Jack]
没有将本地数组的任何更改反映回全局数组。 - 如果更改元素(而不更改数组的长度),则会发生相同的结果。
我还尝试了上述实验的更现实世界的例子 - 将我的自定义“通知”对象数组传递给子视图控制器。 对于分配给本地对象数组的所有自定义对象的更改都不会反映在原始全局数组中。
这种行为对我来说并不理想,我认为最佳做法是使用委托协议将修改后的数组(或任何对象)传递回父对象,然后手动更新全局数组? - 如果是这样,那么相对于Objective C风格的行为,这将创建相当多的额外工作。
最后我确实尝试了inout关键字,这使你能够直接修改传递给目标对象的函数参数变量。更改将反映回全局数组(或对象),但问题在于,如果输入参数被分配给本地变量(以在init函数范围外进行编辑),则对本地变量的更改仍未反映在全局范围内。
希望上述内容有意义 - 它真的让我在Swift中的生产力受到限制。
我是否遗漏了什么,还是说这种矛盾的行为是可以预期的?
如果是这样,那么传递修改后的数据的最佳做法是什么,使用委托?