【发布时间】:2015-07-09 00:10:08
【问题描述】:
谁能帮我解决这个问题。
我理解(认为)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 来保存我的对象,所以我想我需要在更大的集合中找到服务对象,替换该对象,然后将它们保存出来。
但事实证明我不需要,我可以编辑服务变量,并且运行数组会自动更新......就像引用类型一样。
通过? .. 设置变量
在准备 segue 时,只需使用标准方式在第二个 VC 中设置本地 var,var runsInSecondVC = 运行。不使用 &pointers 或任何其他奇怪的东西。
感谢您的帮助。
类基本细节
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!
}
这些是这些类的基础。没什么复杂的。
【问题讨论】:
-
“服务”变量的类型是什么?您的数组是否包含引用类型(类)或值类型(结构)?
-
您能否添加更多关于您传递的内容的实际代码详细信息?
-
数组是类,类Task: NSObject, NSCoding { }
-
请显示这些
runs、service、staffTasks、staff变量的类型 -
我在这里看不到您要打印的任何数组。