我有一个非常奇怪的问题。我在我的应用程序中排序了一组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
以来,我无法重现这一点答案 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)
}