看一下这段简单的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
语句是否有效,但是它根本不会这样做,因为那不是编译器。