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
相关产品推荐
相关产品推荐

