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

时间:2014-11-10 10:28:34

标签: ios objective-c 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)
}

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

更新

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

更新2

我已向Apple提交了一份错误报告。目前我正在使用NSSet对数组进行排序,这似乎工作正常。

上次更新

自Xcode 6.1.1

以来,我无法重现这一点

1 个答案:

答案 0 :(得分:1)

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

1)使闭包内的p1和p2引用NSDictionarys本身而不是闭包参数

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

更改代码,以便最后一节显示:

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