【问题标题】:Bug in Swift's notion of Array equality?Swift 的数组相等概念中的错误?
【发布时间】: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")。然后 url1nil 但编译器抱怨将其添加到数组中。无论哪种方式,我都无法进入比较行
  • @JackWu 大家可以忘记游乐场吗?它们被严重损坏,并且它们的行为与应用程序不正确或相同。唯一重要的地方是应用程序。真实的,编译的应用程序。我的代码来自一个应用程序。它基于更复杂、更常见的现实生活情况。这不是一种技巧;它被归结为一种技巧,只是为了简洁地展示这个问题。
  • 好吧,Swift 和 Playground 一样是 beta 版,所以要提交雷达吗?我不知道你为什么期望 Swift 表现良好,因为游乐场已经严重损坏
  • 在我的测试中,它使用 EXC_BAD_ACCESS 在 obc_retain() 中的 arr1+=url2 处崩溃。在此之前,数组报告它有一个指向 NSObject 的非零指针。怀疑它在复制数组以进行第二次追加时将保留发送到垃圾指针。细小的错误比比皆是。
  • @matt 请确保您提交了一份雷达文件。目前唯一的解决方案是在将其添加到数组之前检查 NSURL 是否为 nil

标签: arrays swift


【解决方案1】:

事实上,Objective-C API 中的所有实例(基本上是任何 UI* 或 NS* 类)实际上都是可选的,尽管通过声明似乎不是这样,因为 Objective-C 类型总是可以是nilNSURL 的数组本质上是隐式展开的可选NSURLs 或NSURL![] 的数组。

(我在this answer中解释了更多。)

因此,数组可以采用nil 值并不是一个错误,但它两个评估为相等的错误。带你到bugreport.apple.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2016-09-15
    • 2011-03-24
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多