在swift中通过视图控制器之间的引用传递数组

当使用Objective-C时,我将一个NSMutableArray从一个视图控制器VC_A给另一个VC_B ,只需将VC_B的属性VC_B

 VC_B.list = self.list 

自我是VC_A

当视图控制器被popup导航栈时,它允许在VC_B的列表中看到列表中的VC_A所做的更改。

然而在Swift中,数组是通过值传递的,如上所述分配不起作用,所以我坚持如何解决这个问题。 现在处理这个问题的正确方法是什么?

你仍然可以在Swift中通过使属性成为一个NSMutableArray ,就像以前一样。 如果您要求,基础types仍然存在。 但是这在ObjC和Swift中都是糟糕的devise。 它在远处创build了令人毛骨悚然的动作(当事情神奇地改变了不是调用的一部分的值),并可能打破MVC(如果数据是持久的,它应该存在于模型中,而不是在视图控制器中)。

Cocoa中有两种常见模式:将数据存储在模型中,或者通过委托传递。

如果这个数组表示某种持久化状态(如系统中的项目列表),那么它就属于模型层,两个视图控制器都应该读取和操作它,而不是通过相互通信。 (请参阅Model-View-Controller 。)

如果这个数组是一个临时的数据(例如从列表中select),那么调用的VC应该把自己设置为接收VC的委托,当接收VC完成时,它应该把数据传回给它的委托。 (请参阅代表和数据源 。)

如果你使用标准的Swift Array是一个值types,你必须使用一个包装器或一个无types的NSArray

 // a generic wrapper class class Reference<T> { var value: T init(_ val: T) { value = val } } // Usage class ViewController1 { static var list = Reference<[Int]>([]) } class ViewController2 { static var list = Reference([3, 5, 7, 9, 11]) func passToOtherVC() { ViewController1.list = self.list } } 

如果你想改变数组,你应该总是改变Reference对象的value属性。

在Swift中,对象是通过引用自动传递的。 NSArray是Objective C类(通过引用传递),其中Array是一个结构体(按值传递)。

所以如果你正在使用NSMutableArray数组已经被引用传递。

就像一个潜在的概念certificate可以补充我对这个问题的评论 – 可以使用Objective-C NSMutableArray来完成这个任务:

 class A { var x: NSMutableArray = NSMutableArray(capacity: 12) } class B { var y: NSMutableArray! } let a = A() let b = B() by = ax by[0] = 123 assert(ax[0] === by[0]) 

不过,这种方法并不遵循处理数据结构IMO的Swift风格。