【问题标题】:Swift Array Pass by Value...same memory address?Swift Array 按值传递...相同的内存地址?
【发布时间】: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 { }
  • 请显示这些runsservicestaffTasksstaff变量的类型
  • 我在这里看不到您要打印的任何数组。

标签: ios arrays swift


【解决方案1】:

按值传递数组

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

【讨论】:

  • 查看我的书了解什么是值类型:apeth.com/swiftBook/ch04.html#SECreferenceTypes
  • 一切都是按值传递,除非你有&,但这无关紧要,因为这里没有传递。
  • @newacct 现在我很困惑.. ?
  • @DogCoffee:也许有过去,但你没有在你的问题中显示任何它,完全不清楚发生了什么。
  • 以正常方式设置变量。
【解决方案2】:

您对数组本身和数组的内容有些困惑。

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

var service = self.staffTasks[indexPath.row]

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

将对象放入数组不会复制对象。事实上,数组保存了对对象的引用,所以上面的行实际上是说“创建一个变量,service,它持有对self.staffTasks[indexPath.row] 持有引用的对象的引用”。只有一个对象,现在在两个地方引用,因此当您更新对象时,更改是通过两个变量可见的。

【讨论】:

  • 把任何东西放在一个数组中都会复制它,就像赋值 (=) 复制它一样。当然,如果“事物”是引用,那么引用就会被复制。 “对象”不是直接的值,只能通过引用访问。
  • 好吧,我差不多就是这么说的
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多