Ios 在swift中通过引用在ViewController之间传递数组
当使用Objective-C时,我只需在Ios 在swift中通过引用在ViewController之间传递数组,ios,swift,pass-by-reference,Ios,Swift,Pass By Reference,当使用Objective-C时,我只需在VC\U B中指定一个属性,即可将NSMutableArray从一个视图控制器VC\U a传递到另一个VC\U B VC_B.list = self.list 其中self是VC\u A 当视图控制器从导航堆栈中弹出时,它允许在列表上的VC_B中所做的更改显示在VC_A的列表中 然而,在Swift中,由于数组是按值传递的,所以如上所述的赋值不起作用,所以我被如何解决这个问题所困扰。现在处理这个问题的正确方法是什么?在Swift中,对象是通过引用自动传递的
VC\U B
中指定一个属性,即可将NSMutableArray
从一个视图控制器VC\U a
传递到另一个VC\U B
VC_B.list = self.list
其中self是VC\u A
当视图控制器从导航堆栈中弹出时,它允许在列表上的VC_B
中所做的更改显示在VC_A
的列表中
然而,在Swift中,由于数组是按值传递的,所以如上所述的赋值不起作用,所以我被如何解决这个问题所困扰。现在处理这个问题的正确方法是什么?在Swift中,对象是通过引用自动传递的。NSArray是一个目标C类(按引用传递),其中as数组是一个结构(按值传递)
因此,如果您使用的是NSMutableArray,则该数组已通过引用传递。作为补充我对该问题评论的潜在概念证明,可以使用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风格。如果使用标准Swift
数组
,这是一种值类型,则必须使用包装器或非类型的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
}
}
//泛型包装器类
课堂参考{
var值:T
init(val:T){value=val}
}
//用法
类ViewController1{
静态变量列表=引用([])
}
类ViewController2{
静态变量列表=参考([3,5,7,9,11])
func passToOtherVC(){
ViewController1.list=self.list
}
}
如果您想改变数组,您应该始终更改
引用
对象的值
属性。您仍然可以在Swift中通过将属性设置为NSMutableArray
,就像以前一样。基金类型仍然存在,如果你要求他们。但这在ObjC和Swift中都是糟糕的设计。它会在一定距离内创建令人毛骨悚然的动作(当事情神奇地改变不属于调用的值时),并可能破坏MVC(如果数据是持久的,它应该存在于模型中,而不是视图控制器中)
Cocoa中有两种常见的模式:将数据存储在模型中,或通过委托传递数据
如果此数组表示某种持久状态(例如系统中的项目列表),则该持久状态属于模型层,并且两个视图控制器都应该在模型层读取和操作它,而不是通过相互通信。(见附件。)
如果此数组是一个临时数据段(如列表中的选择),则调用VC应将自身设置为接收VC的委托,当接收VC完成时,应将数据传递回其委托。(请参阅。)当您弹出VC时,将数组重新传递给VC_A。我想这篇博文解释了Swift的重点是将基本数据结构表示为值,而不是为了方便起见的引用-我怀疑您可以使用NSArray获得类似于objective-c风格的东西,但是Swift有不同的做事方式,你可能想重新评估你的方法,使之更为迅速。我认为,即使在Objective-C中,这也是错误的解决方案。为了依赖这类东西而赋予类可变的公共属性是一个相当危险的命题。。。尤其是当你进入应用程序的多线程领域时,使用NSMutableArray可以让我暂时加入解决方案