gpt4 book ai didi

ios - Swift 优化级别 'Fastest' 中断数组排序

转载 作者:搜寻专家 更新时间:2023-10-30 22:00:28 25 4
gpt4 key购买 nike

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

下面是可以在 Playground 上运行的代码,其中包含一些示例 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)
}

如您所见,在 playground 中排序确实有效。有谁知道哪里出了问题?

更新

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

更新 2

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

最后更新

自 Xcode 6.1.1 以来我无法重现此内容

最佳答案

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

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

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

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

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

关于ios - Swift 优化级别 'Fastest' 中断数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26841615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com