Swift 2.1错误排序到位,仅在发布版本上

时间:2015-10-30 20:32:13

标签: ios swift compiler-errors

我开始在下面的代码中获取排序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崩溃。确切的数字可能与你不同。

4 个答案:

答案 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进行编译也应该解决问题。