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

Swift实现快速排序报错:无法对不可变值使用可变成员

问题修复:Swift快速排序中swapAt报错的解决方法

错误原因

Swift函数的参数默认是不可变的let常量,而swapAt是数组的mutating方法,仅能在可变数组var上调用。你的quicksort函数接收的array参数默认是let,因此调用array.swapAt时会触发报错。

修复步骤

1. 将排序函数的数组参数改为inout类型

inout关键字允许函数直接修改传入的变量本身,而非操作其副本。修改两个quicksort函数的参数定义:

func quicksort(array: inout [Int], lowIndex: Int, highIndex: Int) {
    // 原有逻辑保持不变
}

func quicksort(array: inout [Int]) {
    quicksort(array: &array, lowIndex: 0, highIndex: array.count - 1)
}

2. 调用排序函数时添加&符号

在main函数中调用quicksort时,需要在数组变量前加&,表示传递变量的引用:

quicksort(array: &array)

3. 可选优化:简化数组生成逻辑

可以用Swift内置的array.contains(rand)替代自定义的contains函数,简化代码:

func main(){
    var array = [Int.random(in: 0..<30)]
    while array.count < 21 {
        let rand = Int.random(in: 0..<21)
        if !array.contains(rand) {
            array.append(rand)
        }
    }
    // 打印和排序逻辑保持不变
}

完整修复后的代码

import Foundation

func quicksort(array: inout [Int], lowIndex: Int, highIndex: Int){
    if lowIndex >= highIndex {
        return
    }

    let pivot = array[highIndex]
    var leftPointer = lowIndex
    var rightPointer = highIndex

    while leftPointer < rightPointer {
        while array[leftPointer] <= pivot && leftPointer < rightPointer {
            leftPointer += 1
        }

        while array[rightPointer] >= pivot && leftPointer < rightPointer {
            rightPointer -= 1
        }

        array.swapAt(leftPointer, rightPointer)
    }

    if array[leftPointer] > array[highIndex] {
        array.swapAt(leftPointer, highIndex)
    } else {
        leftPointer = highIndex
    }

    quicksort(array: &array, lowIndex: lowIndex, highIndex: leftPointer - 1)
    quicksort(array: &array, lowIndex: leftPointer + 1, highIndex: highIndex)
}

func quicksort(array: inout [Int]){
    quicksort(array: &array, lowIndex: 0, highIndex: array.count - 1)
}

func main(){
    var array = [Int.random(in: 0..<30)]
    while array.count < 21 {
        let rand = Int.random(in: 0..<21)
        if !array.contains(rand) {
            array.append(rand)
        }
    }

    print("Before:")
    print(array)
    print("\nAfter:")
    quicksort(array: &array)
    print(array)    
}

main()

验证效果

运行修改后的代码,数组会被正确排序,swapAt相关报错不再出现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:10:48