我开始在下面的代码中获取排序lamdba的崩溃报告,下面灰色框中的第三行:
docker exec -ti <container name>
请注意,在XCode的调试版本中不会发生崩溃。只有App Store和Ad Hoc档案才会崩溃,并且只有当块列表的长度为数百个时才会崩溃。
我将代码修改为此,问题就消失了:
private func fixOverlaps(inout blocks: [TimeBlock], maxOverlaps: Int? = nil) {
blocks.sortInPlace { a,b in
if a.startTime < b.startTime {
return true
} else if a.startTime == b.startTime && a.endTime < b.endTime {
return true
}
return false
}
...
我有没有想过如何使用inout或sortInPlace?我可以尝试做一个演示。它适用于iOS(8/9)和Swift 2.1的多个版本。
EDIT --------------------
好的,这是崩溃的最小版本。事实证明,这是一个红鲱鱼。如果在XCode 7.1中启动新的单个视图项目,则可以使用以下命令替换视图控制器:
private func fixOverlaps(inout blocks: [TimeBlock], maxOverlaps: Int? = nil) {
blocks = blocks.sort { a,b in
if a.startTime < b.startTime {
return true
} else if a.startTime == b.startTime && a.endTime < b.endTime {
return true
}
return false
}
...
所以在发行版中运行它,你应该看到它打印“完成”如果你在17左右结束循环但是与20崩溃。确切的数字可能与你不同。
答案 0 :(得分:6)
使用self.list = self.list.sort()
代替self.list.sortInPlace()
,在不损失功能的情况下解决此问题。
答案 1 :(得分:4)
这是Xcode 7.1中的一个错误。将swift编译器优化级别从快速转为无,为我解决了这个问题。
答案 2 :(得分:3)
此代码看起来正确。听起来你遇到了编译器中的一个错误,当你在发布配置中崩溃而不是调试时通常就是这种情况。您可以通过在调试构建和测试中启用优化来验证这一点,以查看它是否会产生问题。除了您的解决方法之外,您唯一需要做的就是file a bug。
答案 3 :(得分:3)
我今天早些时候记录了bug on bugs.swift.org,并收到一位开发人员的快速回复,这确实是Xcode 7.1的一个问题。他指出其解决方案概述于Xcode 7.2 Release Notes:
优化器中的错误已得到修复,导致可变集合的就地排序崩溃。 (23081349)
因此使用Xcode 7.2进行编译也应该解决问题。