有人可以帮我解决这个问题。
我理解(思考)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!
}
这些是这些课程的基础。没什么复杂的。
答案 0 :(得分:2)
按值传递数组
没有。 Swift数组是值类型。这并不意味着它们是按值传递的。这意味着您可以通过引用来改变数组,而不会影响已分配该数组的其他引用。
答案 1 :(得分:1)
您对阵列本身和阵列内容感到有些困惑。
..如果我访问数组中的项目
var service = self.staffTasks[indexPath.row]
并编辑该值,更新服务变量值和数组中的元素。它们具有相同的内存地址......
将对象放入数组不会复制对象。实际上,数组包含对象的引用,因此上面的行实际上表示“创建一个变量,service
,其中包含对self.staffTasks[indexPath.row]
持有对”的引用的对象的引用。只有一个对象,现在在两个地方引用,因此当您更新对象时,通过两个变量都可以看到更改。