使用Objective-C时我只需将NSMutableArray
中的属性指定为
VC_A
从一个视图控制器VC_B
传递到另一个VC_B
VC_B.list = self.list
其中self是VC_A
当视图控制器被弹出导航堆栈时,它允许在VC_B
的列表中看到列表中VC_A
所做的更改。
然而在Swift中,由于数组是按值传递的,所以如上所述分配不起作用,所以我无法解决这个问题。现在处理这个问题的正确方法是什么?
答案 0 :(得分:3)
您仍然可以通过将属性设为NSMutableArray
来在Swift中执行此操作,就像之前一样。如果您要求,基础类型仍然存在。但这在ObjC和Swift都是糟糕的设计。它会在远处创建怪异的动作(当事物神奇地改变不属于调用的值时)并且可能会破坏MVC(如果数据是持久的,它应该存在于模型中,而不是视图控制器中。)
Cocoa中有两种常见的模式:将数据存储在模型中,或通过委托传递它。
如果此数组表示某种持久状态(例如系统中的项列表),那么它属于模型层,并且两个视图控制器都应该在那里读取和操作它,而不是通过彼此通信。 (见Model-View-Controller。)
如果此数组是瞬态数据(例如从列表中选择),则调用VC应将自身设置为接收VC的委托,并且当接收VC完成时,它应将数据传递回它的代表。 (见Delegates and Data Sources。)
答案 1 :(得分:2)
如果您使用标准Swift Array
这是一种值类型,则必须使用包装器或无类型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
}
}
如果要改变数组,应始终更改value
对象的Reference
属性。
答案 2 :(得分:1)
在Swift中,对象会自动通过引用传递。 NSArray是一个Objective C类(通过引用传递),其中Array是一个struct(按值传递)。
因此,如果您正在使用NSMutableArray,则数组已经通过引用传递。
答案 3 :(得分:-1)
正如作为概念的潜在证据补充我对该问题的评论 - 可以使用Objective-C NSMutableArray来完成此任务:
class A {
var x: NSMutableArray = NSMutableArray(capacity: 12)
}
class B {
var y: NSMutableArray!
}
let a = A()
let b = B()
b.y = a.x
b.y[0] = 123
assert(a.x[0] === b.y[0])
尽管如此,这种方法并不遵循处理数据结构IMO的Swift风格。