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)