【发布时间】:2014-07-02 20:44:28
【问题描述】:
试试这个:
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!?
经过一些实验,我认为这与Optionals有关。 url1 返回为 nil,因此要形成一个包含两个 url 的数组,Swift 必须将这些数组(我猜)视为 Optional<NSURL> 的数组。但我仍然认为这是一个错误;就好像比较一个可选的 NSURL 数组的概念导致 Swift 不知何故举起手来......而且,有人可能会争辩说,这也是另一种意义上的错误,因为我明确地将这些数组键入为 NSURL[];我没有说NSURL?[],那么为什么 Swift 一开始就允许 Optional 进入它们呢?
我想知道是否有人注意到任何类似的事情可能会阐明此事。 (我不认为this post 是相关的,当然我可能是错的。)
编辑有些人表示无法重现该问题,所以我在https://github.com/mattneub/SwiftArrayEqualityTest发布了一个示例项目
【问题讨论】:
-
这没有多大意义,如果
url1是可选的,则无法将其添加到数组中而不会出现编译器错误。在我的操场上,let url1 = NSURL(string: "foo bar")抛出异常,如果我添加这样的类型:let url1:NSURL? = NSURL(string: "foo bar")。然后url1是nil但编译器抱怨将其添加到数组中。无论哪种方式,我都无法进入比较行 -
@JackWu 大家可以忘记游乐场吗?它们被严重损坏,并且它们的行为与应用程序不正确或相同。唯一重要的地方是应用程序。真实的,编译的应用程序。我的代码来自一个应用程序。它基于更复杂、更常见的现实生活情况。这不是一种技巧;它被归结为一种技巧,只是为了简洁地展示这个问题。
-
好吧,Swift 和 Playground 一样是 beta 版,所以要提交雷达吗?我不知道你为什么期望 Swift 表现良好,因为游乐场已经严重损坏
-
在我的测试中,它使用 EXC_BAD_ACCESS 在 obc_retain() 中的
arr1+=url2处崩溃。在此之前,数组报告它有一个指向 NSObject 的非零指针。怀疑它在复制数组以进行第二次追加时将保留发送到垃圾指针。细小的错误比比皆是。 -
@matt 请确保您提交了一份雷达文件。目前唯一的解决方案是在将其添加到数组之前检查 NSURL 是否为
nil。