Swift数组通过值传递…相同的内存地址?

有人可以请为我清除这个。

我明白(思想) Swift通过传递数组因为它是一个结构。

但是,当我通过segue传递数组到下一个视图控制器时,它在我看来是通过引用传递的,因为当我检查数组的内存地址时,它们是相同的。

这是我如何检查

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

我以为这些内存地址会不一样? 或者我只是迷惑自己。

Run / StaffTask类为了保存目的而从NSObjectinheritance。

 class Run: NSObject, NSCoding { } 

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

 var service = self.staffTasks[indexPath.row] 

并编辑该值,数组中的服务variables值和元素都将被更新。 他们有相同的内存地址,如图所示

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

也…

staffTasks是一个称为runs的较大数组的子集

当我search服务对象,更大的集合,我发现他们也是相同的内存地址

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

我正在使用NSCoding来保存我的对象,所以我想我需要find更大的集合中的服务对象,取代该对象,然后将其保存。

但事实certificate,我不需要,我可以编辑服务variables和运行数组自动更新…就像一个引用types会。

通过? 设置Var

在准备segue时,只需使用标准方法在第二个VC中设置本地var,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! } 

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

按值传递数组

不,Swift数组是一个值types 。 这并不意味着它们是按价值传递的。 这意味着您可以通过引用的方式对数组进行变异,而不会影响已分配给该数组的其他引用。

你对数组本身和数组的内容有点困惑。

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

 var service = self.staffTasks[indexPath.row] 

并编辑该值,数组中的服务variables值和元素都将被更新。 他们有相同的内存地址…

将对象放入数组不会复制对象。 事实上,数组持有一个对象的引用,所以上面的行实际上是说“创build一个variables, service保存对self.staffTasks[indexPath.row]持有引用的对象的引用”。 只有一个对象,现在在两个地方引用,所以当你更新对象时,通过这两个variables可以看到变化。