【问题标题】:Swift arrays identity "Type does not conform to protocol 'AnyObject'" errorSwift 数组标识“类型不符合协议‘AnyObject’”错误
【发布时间】:2014-09-11 12:06:16
【问题描述】:

我创建了 Playground 并编写了这段代码:

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

a === b

游乐场给了我错误Type '[Int]' does not conform to protocol 'AnyObject'

我做错了什么?

我正在使用 XCode 6 GM Seed。

更新

这段代码取自“The Swift Programming Language”一书,其中指出:

“Check whether two arrays or subarrays share the same storage and elements by comparing them with the identity operators (=== and !==).”

在“类和结构”一章中。

更新 2 摘自早期 Swift 规范的旧版书籍。我下载了新鲜的,没有这个词。所以身份运算符只能应用于类实例。

【问题讨论】:

  • 我在 Swift Programming Language 的最新更新中找不到此摘录。
  • 该死!那是旧版!我在 iBooks 中重新下载了它,但没有这样的摘录 :( iBooks 是否会在更新后自动重新下载书籍,或者我必须手动重新下载?
  • updated document 中声明“使用这些运算符来检查两个常量或变量是否引用同一个实例:”。

标签: arrays swift identity swift-playground


【解决方案1】:

根据Swift 编程语言

“等同于”[由三个等号表示,或===]表示两个类类型的常量或变量 引用完全相同的类实例。

在 Swift 中,数组是结构体。因此,您不能尝试使用=== 将一个数组与另一个数组进行比较。否则,以下代码 - 使用 NSArray - 可以正常工作并且不会在 Playground 中给出任何错误消息:

var a = [1, 2, 3] as NSArray //NSArray is not a Struct
var b = a
a === b //true

The Swift Programming Language对此给出了解释:

结构实例总是按值传递,而类实例 总是通过引用传递。

当然,Identical to (===) 与 Equal to (==) 的目标不同,后者可以帮助您检查两个实例是否被视为“相等”或“相等”的价值。例如,以下代码将在 Playground 中编译而不会出现任何错误消息:

var a = [1, 2, 3]
var b = a
a == b //true

【讨论】:

  • 我完全同意你的看法。但是同一本书指出我可以使用=== 来“检查两个数组或子数组是否共享相同的存储和元素”。查看我对问题的更新。
【解决方案2】:

=== 与 operator 相同,仅适用于类实例。数组是结构,因此该运算符没有功能。我同意在这种情况下错误消息的描述性不够。

使用== 比较数组是否相等。

【讨论】:

  • 我不能将== 用于包含对象的数组。请看我的更新。可能是苹果改变了 Swift 规范?
  • 在书中找不到那句话。
  • 我在 iBooks 中有一个旧版本。重新下载并没有这样的报价。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2014-10-23
  • 2015-01-02
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多