看一下这段简单的Swift代码:

for index in 10...6 {
    print(index)
}

我想知道为什么它在运行时崩溃,而不是在编译时被检测到。

最佳答案

您为什么认为应该在编译时检测到它?

基础函数...定义为

public func ...<Pos : ForwardIndexType where Pos : Comparable>(start: Pos, end: Pos) -> Range<Pos>

与其他功能一样,它是正常功能。它仅包含一个检查,以确保end在运行时不小于start。编译器在这里无能为力。

这就像问为什么编译器在编译时无法在以下代码中检测到崩溃,而在运行时崩溃:
func bla(input:Int) {
    let k = input / input
}
bla(0)

编译器不会检查对方法的调用是否成功,而是会验证参数是否匹配,优化代码等。它不会检查每个执行路径。您当然可以构建执行此操作的编译器,但这将很困难。考虑引入一个静态变量,该变量会在每次调用bla时改变其行为,...也是如此-当然,编译器可以检查10...6语句是否有效,但是它根本不会这样做,因为那不是编译器。

10-08 08:17
查看更多