Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在swift中通过引用在ViewController之间传递数组_Ios_Swift_Pass By Reference - Fatal编程技术网

Ios 在swift中通过引用在ViewController之间传递数组

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中,对象是通过引用自动传递的

当使用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中,对象是通过引用自动传递的。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可以让我暂时加入解决方案