为什么 Swift 中的反转范围在运行时而不是在编译时崩溃

Why a inverted range in Swift crashes at runtime instead of at compilation time

查看这段简单的 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 是有效的,但它根本不这样做,因为那不是编译器的工作。