Arrays Swift&x27中的Bug;什么是数组相等的概念?
试试这个:Arrays Swift&x27中的Bug;什么是数组相等的概念?,arrays,swift,Arrays,Swift,试试这个: let url1 = NSURL(string: "foo bar") let url2 = NSURL(string: "http://www.apple.com") var arr1 = NSURL[]() var arr2 = NSURL[]() // one order arr1 += url1 arr1 += url2 // other order arr2 += url2 arr2 += ur
let url1 = NSURL(string: "foo bar")
let url2 = NSURL(string: "http://www.apple.com")
var arr1 = NSURL[]()
var arr2 = NSURL[]()
// one order
arr1 += url1
arr1 += url2
// other order
arr2 += url2
arr2 += url1
// equality test
println(arr1 == arr2) // true!?
经过一些实验,我认为这与期权有关url1
返回为nil,因此为了形成两个url的数组,Swift必须将这些数组(我猜)视为可选的数组。但我仍然认为这是一个错误;这就好像比较一系列可选NSURL的概念让Swift不知何故举起了手。。。有人可能会说,这也是另一种意义上的bug,因为我将这些数组显式地键入为NSURL[]
;我没有说NSURL?[]
,那么为什么Swift首先允许一个可选的进入它们呢
我想知道是否有人注意到类似的事情,这可能会让事情变得明朗。(我不认为这有什么关系,当然我可能错了。)
编辑有些人表示无法重现该问题,因此我在上发布了一个示例项目。事实上,Objective-C API(基本上是任何UI*或NS*类)中的所有实例实际上都是可选的,尽管通过声明似乎不是可选的,因为Objective-C类型始终可以是nil
。NSURL
数组本质上是隐式展开的可选NSURL
s或NSURL![]
(我在书中解释了更多。)
因此,数组可以取nil
值并不是一个bug,而是两个值相等的bug。请访问。这没有多大意义,如果url1
是可选的,则在没有编译器错误的情况下无法将其添加到数组中。在我的游乐场中,let url1=NSURL(字符串:“foo-bar”)
抛出一个异常,如果我添加这样的类型:let url1:NSURL?=NSURL(字符串:“foo-bar”)
。然后url1
是nil
,但编译器抱怨将其添加到数组中。不管怎样,我都无法到达比较线all@JackWu请大家忘记操场好吗?它们严重损坏,行为不正确或与应用程序不一致。唯一重要的地方是应用程序。真实的、编译过的应用程序。我的代码来自一个应用程序。而且它是基于一个更复杂的,经常遇到的现实生活中的情况。这不是一种诡计;这可以归结为一种技巧,只是为了简洁地说明这个问题。斯威夫特和游乐场一样是beta版,所以要提交一份雷达文件吗?我不知道你为什么期望Swift表现良好,因为在我的测试中,游乐场严重损坏,它在obc_retain()中的arr1+=url2
处崩溃,EXC_BAD_访问。在此之前,数组报告具有指向NSObject的非nil指针。在为第二次追加复制数组时,怀疑它正在向垃圾指针发送retain。“小虫子比比皆是。@马特,请确保你提交了雷达文件。目前唯一的解决方案是在将NSURL添加到阵列之前检查NSURL是否为nil
。