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

Car*_*los 10 compiler-errors ios swift

我开始在下面的代码中获取lamdba排序的崩溃报告,下面灰色框中的第三行:

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
    }
...
Run Code Online (Sandbox Code Playgroud)

请注意,在XCode的调试版本中不会发生崩溃.只有App Store和Ad Hoc存档才会崩溃,并且只有当阻止列表的长度为数百时才会崩溃.

我将代码修改为此,问题就消失了:

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
    }
...
Run Code Online (Sandbox Code Playgroud)

有没有我错过了如何使用inout或sortInPlace?我可以尝试做一个演示.它适用于iOS(8/9)和Swift 2.1的多个版本.

编辑 - - - - - - - - - -

好的,这是一个崩溃的最小版本.事实证明,这是一个红鲱鱼.如果在XCode 7.1中启动新的单个视图项目,则可以使用以下命令替换视图控制器:

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    var blocks = [TimeBlock]()
    for var i in 0...20 { //Works if you put in a small number like 8
        let t = TimeBlock()
        t.start = Int(arc4random_uniform(1000)) //Get some random numbers so the sort has to do some work
        t.end = Int(arc4random_uniform(1000))
        blocks.append(t)
    }

    blocks.sortInPlace { a,b in
        if a.start > b.start {
            return true
        }
        return false
    }

    print("done") //Gets here on debug, not release
}

class TimeBlock {
    var start = 0
    var end = 0
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}
Run Code Online (Sandbox Code Playgroud)

所以在发布时运行它,你应该看到它打印"完成",如果你在17左右结束循环但是崩溃20.确切的数字可能会有所不同.

Den*_*s L 6

通过使用self.list = self.list.sort()而不是失去功能而解决了这个问题self.list.sortInPlace().


Cha*_* A. 3

这段代码看起来是正确的。听起来您在编译器中遇到了错误,通常是在发布配置中崩溃但在调试中崩溃时出现的情况。您也许可以通过在调试构建中启用优化并测试它是否会产生问题来验证这一点。除了解决方法之外,您唯一需要做的就是提交错误