You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中比较数组元素与值时触发Range越界致命错误排查

TwoSum代码崩溃原因分析

执行以下代码时:

func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
    let length = nums.count-1;

    for index1 in 0...length {
        let difference = target - nums[index1];
        print(target, difference, nums[index1])
        if (nums[index1] < difference) {
            for index2 in index1+1...length {
                if (nums[index2] == difference) {
                    return [index1, index2];
                }
            }
        }
    } 

    return [];
}

let summer = twoSum([-1,-2,-3,-4,-5], -8)

出现崩溃错误:

Swift/ClosedRange.swift:347: Fatal error: Range requires lowerBound <= upperBound

错误核心原因

崩溃的本质是创建了不符合规则的闭区间:
当index1遍历到数组最后一个元素(即index1=4,对应数值-5)时,计算得difference = -8 - (-5) = -3,此时nums[index1] < difference(-5 < -3)条件成立,会执行内层循环的区间index1+1...length。但index1+1=5,而length=4(数组长度为5,count-1=4),这就形成了5...4的闭区间——Swift要求区间的下界必须小于等于上界,这个无效区间直接触发了致命错误。

修改条件后正常的原因

当把if条件改为nums[index1] <= target时,针对测试用例中的index1=4,nums[index1]=-5,target=-8,-5 <= -8不成立,因此不会进入内层循环,也就避免了创建无效区间的问题。

需要注意的是,这个修改只是临时规避了崩溃,并没有从根本上修复twoSum的逻辑漏洞——该条件本身和两数之和的核心逻辑无关,换其他测试用例可能仍会出错。更合理的修复方式是进入内层循环前先判断index1+1 <= length,确保区间有效,或者改用哈希表这类更高效且逻辑严谨的解法。

内容的提问来源于stack exchange,提问作者ATL_DEV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:18:16