【问题标题】:Check if two arrays share the same elements检查两个数组是否共享相同的元素
【发布时间】:2014-07-29 09:13:09
【问题描述】:

我已经在 .playgraound 中编写了这段代码

var a = [1, 2, 3]
var b = a
var c = a

if b === c
{
    "b and c still share the same array elements."
}
else
{
    "b and c now refer to two independent sets of array elements."
}

结果是“b 和 c 现在指的是两组独立的数组元素”,但在“Swift 编程语言”中,Apple 这么说

下面的示例使用“相同于”运算符 (===) 来检查 b 和 c 是否仍然共享相同的数组元素。

你能解释一下为什么它们不同吗?

【问题讨论】:

  • 即使 a === a 返回 false。
  • 我无法重现您的错误。
  • @helderdarocha 这不是错误,这是本书第 307 页的消息。
  • 似乎有一个错误,我要提交一个雷达。在 iOS 操场上,b === c 正在返回 false。在 OS X 操场上,它返回 true。在 REPL 中,它返回 true。在 iOS 应用程序中,它返回 false。根据书本,应该返回true

标签: arrays swift


【解决方案1】:

书上说的原因

结果是“b 和 c 现在引用了两组独立的数组元素”

是本书前面的代码停止了bc 之间的数组共享,这是通过将a 分配给它们两者来建立的:

b.unshare() // Page 306, line 3

数组 a 已通过在第 305 页第 1 行附加一个元素隐式地从 bc 取消共享。

使用您显示的代码,"b and c still share the same array elements." 消息将被打印出来。

【讨论】:

  • 这个怎么样。 var a : Array = [1, 2, 3] if a === a { println("b 和 c 仍然共享相同的数组元素。") } else { println("b 和 c 现在指的是两个独立的集合数组元素。”)}。它仍然返回 false a === a。
【解决方案2】:

b === c 测试如果您更改b 的元素之一,c 会发生什么,反之亦然。在您的示例中,b === c 的计算结果为 true,因此当您更改 b 的元素时:

var a = [1, 2, 3]
var b = a
var c = a

b[1] = 10

你看到c中反映的变化:

c[1] // returns 10

您可以使用unshare() 方法确保b 引用一个独立的数组实例:

b.unshare()
b === c // returns false

b[2] = 10
c[2] // returns 3

【讨论】:

  • b === c 在他的示例中返回 false。 bc 指的是 a 的两个不同副本,因此更改 b 并不反映 c 的更改
  • 不,它没有。在新的 Playground 中写 var a = [1, 2, 3]; var b = a; var c = a; b === c。最后一个表达式的计算结果为true
  • 我将确切的代码复制到操场上,b === c 为我返回 false。但我同意,根据这本书,它应该返回 true,所以我会删除反对票,但除非你编辑你的答案,否则我不能。
  • 太奇怪了……你用的是 swift-600.0.34.4.5,你在操场上还有其他代码吗?
  • 如果我在 REPL (swift-600.0.34.4.5) 中运行它,它会返回 true。我不知道如何确定操场上的版本。 (不,操场上没有任何其他代码)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多