在Swift中的ViewControllers之间传递数组/对象

Woo*_*ock 6 ios swift ios8

继这个问题之后:Swift数组赋值是否不一致(既不是引用也不是深拷贝)?-

我一直在玩Swift中的传递对象并注意到一些奇怪的结果.

为了阐明的那种行为的我是使用(之前SWIFT)将是目标C的

举一个我的应用程序(用Obj C编写)的例子,我有一个'通知列表'的概念. - 实际上只是一组自定义对象.

在该App中,我经常将我的全局"通知"数组传递给各种viewControllers,这些viewControllers提供用于更新列表的UI.

当我将全局数组传递给子viewController时,我将它分配给收件人对象中的本地数组变量.然后,只需更新/更改本地数组,这些更改就会反映在rootViewController上的全局数组中.我理解这种行为隐含在Objective C中作为通过引用传递的对象,但这非常方便,我一直试图在Swift中复制这种行为.

然而,当我在Swift中重写我的应用程序时,我已经碰壁了.

我首先尝试将一个Swift数组的字符串 (不是NSMutableArray)从rootViewController传递给子viewController(如上所述).

这是在子视图中传递字符串数组时的行为:

我传入:

[比尔,鲍勃,杰克] 然后将这个传递的数组分配给本地数组进行本地修改,

然后我将字符串"Frank"附加到本地数组

结果是:

本地数组 = [比尔,鲍勃,杰克,弗兰克]

全球阵列 = [比尔,鲍勃,杰克]

对本地数组的更改不会反映回全局数组.- 更改元素时发生相同的结果(不更改数组的长度.)

我还尝试了一个更真实世界的例子 - 将一个自定义'notification'对象的数组传递给子viewController.该SAME结果与发生没有变化到自定义对象的本地分配的阵列被反射到在通过原始的全局阵列.

这种行为对我来说是不可取的,我假设这里的最佳做法是使用委托协议将修改后的数组(或任何对象)传递回父对象,然后手动更新全局数组? - 如果是这样,这会在Objective C样式行为上产生相当多的工作量.

最后我尝试了inout关键字,它有效地让你直接修改传递给目标对象的函数参数var.

更改将反映回全局数组(或对象)问题是,如果将输入参数分配给局部变量(要在init函数的范围之外进行编辑),对局部变量的更改仍未反映在全局范围内.

我希望上面的内容是有道理的 - 用Swift来扼杀我的生产力.

我是否遗漏了某些事情或预期会出现这种精神分裂症行为?

如果是这样,那么将修改后的数据传回去的最佳做法是什么?

Pau*_*w11 3

链接的问题提供了答案 - 这是为了性能。

这种行为可能不适合您,但我想说,依赖调用方法来修改参数的副作用是不被认为是理想的行为 - 特别是在数据结构可以是多线程、多核的环境中。已损坏。

在我看来,依赖副作用的设计是有缺陷的。

如果函数需要修改“全局”,那么它们应该返回新值,或者如果不可能,那么您应该将数组包装在对象内并提供适当的函数来操作数据值。

Swift 使用数组模糊了内部函数和对象之间的界限,这使得它有点令人困惑 - 在 Objective-C 中, NSMutableArray 是一个对象,因此它总是通过引用传递。

为了通知其他对象数据已更改,您可以使用观察者模式。典型的委托模式只有一个注册的委托 - 使用观察者模式,您可以拥有多个注册的观察者。

您可以通过 NSNotificationCenter 或“委托”数组来完成此操作。前者比委托更具有代码解耦的优点