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.确切的数字可能会有所不同.