ios - Swift Array 按值传递...相同的内存地址?

标签 ios arrays swift

谁能帮我解决这个问题。

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

但是当我通过 segue 将数组传递给下一个 View Controller 时,在我看来它是通过引用传递的,因为当我检查数组的内存地址时它们是相同的。

这是我检查的方式

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 = runs。不使用 &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!
}

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

最佳答案

passes arrays by value

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

关于ios - Swift Array 按值传递...相同的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31305989/

相关文章:

ios - 如何为 UIBarButtonItem 设置标题?

ios - 获取值 NSDictionary 的索引

C++ 指针和数组

ios - Lottie:无法获取带名称的动画

python - 对数组进行切片以排除单个元素

javascript - 如何在数组中保存相同的对象类型

Swift UI 测试查找自定义 UIView XCUIElement

swift - 错误 : cannot invoke 'onNext' with an argument list of type '(String)' RxSwift

ios - 限制 UITextfield 长度限制了我所有的 UITextfields

ios - 如果 iOS 变得无响应,iOS 会终止我的应用程序吗?