在swift中的viewcontrollers之间通过引用传递数组

时间:2015-08-17 11:27:09

标签: ios swift pass-by-reference

使用Objective-C时我只需将NSMutableArray中的属性指定为

,即可将VC_A从一个视图控制器VC_B传递到另一个VC_B
VC_B.list = self.list

其中self是VC_A

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

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

4 个答案:

答案 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风格。