Swift优化级别'Fastest'打破了数组的排序

Ren*_*ené 7 objective-c ios swift

我有一个非常奇怪的问题.我在我的应用程序中对一组NSDictionary对象进行了排序,但它只能在应用程序从Xcode运行时才能正常工作.只要我分发应用程序并在设备上安装并运行它,分类就不再有效.

这里的代码可以在一个操场上运行,有一些示例NSDictionary对象.应用程序中的代码是相同的.

import UIKit

let p1 = NSDictionary(objects: ["Zoe", 32], forKeys: ["name", "age"])
let p2 = NSDictionary(objects: ["Adrian", 54], forKeys: ["name", "age"])
let p3 = NSDictionary(objects: ["Jeff", 23], forKeys: ["name", "age"])
let p4 = NSDictionary(objects: ["", 66], forKeys: ["name", "age"])
let p5 = NSDictionary(objects: [23], forKeys: ["age"])

let persons = [p1,p2,p3,p4,p5]

let sortedPersons = persons.sorted { (p1, p2) -> Bool in
    (p2["name"] as? String) > (p1["name"] as? String)
}
Run Code Online (Sandbox Code Playgroud)

如您所见,在操场上排序确实可以正常工作.有谁知道什么可能是错的?

更新

我发现Swift优化级别导致了这个问题.将此设置为-O(最快)将导致排序失败.将其设置为-Onone(无)将导致排序正常工作.
有没有人对如何更改代码有任何建议,所以它将与-O优化一起使用?

更新2

我在Apple提交了一份错误报告.暂时我正在使用一个NSSet对数组进行排序,这似乎工作得很好.

最后更新

自Xcode 6.1.1以来,我无法重现这一点

小智 1

这似乎取决于您排序的闭包中的命名约定。将 (p1, p2) 更改为不同的名称即可解决该问题。使用 -Ofastest 时,编译器似乎错误地做了两件事:

1) 导致闭包中的 p1 和 p2 引用 NSDictionary 本身而不是闭包参数

2) 过早地清理对 NSDictionary 对象的引用,给定 #1

更改代码,使最后一部分显示:

let sortedPersons = persons.sorted { (d1, d2) -> Bool in
    (d2["name"] as? String) > (d1["name"] as? String)
}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定你是否认真对待这个问题,但我还是尝试了。这没有什么区别。 (3认同)