Swift数组传递值...相同的内存地址?

时间:2015-07-09 00:10:09

标签: ios arrays swift

有人可以帮我解决这个问题。

我理解(思考)Swift传递数组按值,因为它是一个结构。

但是当我通过segue将数组传递给下一个视图控制器时,在我看来它是通过引用传递的,就像我检查数组的内存地址时一样。

这就是我检查的方式

println("\(unsafeAddressOf(runs))") // 0x0000000174240c00

我原以为这些内存地址会有所不同?或者我只是困惑自己。

Run / StaffTask类都继承自NSObject以进行保存。

class Run: NSObject, NSCoding { } 

此外,如果我访问数组中的项目

var service = self.staffTasks[indexPath.row]

并编辑该值,更新服务变量值和数组中的元素。它们具有相同的内存地址,如

所示
println("\(unsafeAddressOf(service))  \(unsafeAddressOf(self.staffTasks[indexPath.row]))")

也...

staffTasks是名为runs

的较大数组的子集

当我搜索服务对象时,使用更大的集合,我发现它们也是相同的内存地址

if let index = find(self.runs, self.staff) {
    println("local \(unsafeAddressOf(self.staff))  main list \(unsafeAddressOf(self.runs[index]))")
}

我正在使用NSCoding来保存我的对象,所以我想我需要在更大的集合中找到服务对象,替换该对象然后将它们保存。

但事实证明我不需要,我能够编辑服务变量,并且运行数组会自动更新......就像引用类型一样。

传? ..设置Var

在准备segue时,只需使用标准方式在第二个VC中设置局部变量,var runsInSecondVC =运行。不使用,指针或任何其他古怪。

感谢您的帮助。

班级基本详情

class Run: NSObject, NSCoding {

    var runDate:NSDate!
    var staffName:String!
    var staffEmail:String!
    var runTasks:[StaffTask]!

}

class StaffTask: NSObject, NSCoding {

    var taskName:String
    var taskTime:NSInteger
    var clientName:String!
}

这些是这些课程的基础。没什么复杂的。

2 个答案:

答案 0 :(得分:2)

  

按值传递数组

没有。 Swift数组是值类型。这并不意味着它们是按值传递的。这意味着您可以通过引用来改变数组,而不会影响已分配该数组的其他引用。

答案 1 :(得分:1)

您对阵列本身和阵列内容感到有些困惑。

  

..如果我访问数组中的项目

var service = self.staffTasks[indexPath.row]
     

并编辑该值,更新服务变量值和数组中的元素。它们具有相同的内存地址......

将对象放入数组不会复制对象。实际上,数组包含对象的引用,因此上面的行实际上表示“创建一个变量,service,其中包含对self.staffTasks[indexPath.row]持有对”的引用的对象的引用。只有一个对象,现在在两个地方引用,因此当您更新对象时,通过两个变量都可以看到更改。