我试着写一个简单的冒泡排序功能:
func bubbleSort(array: [Int]) -> [Int] {
while !isSorted(array) {
for index in 1..<array.count {
if array[index - 1] > array[index] {
let temp: Int = array[index]
array[index] = array[index - 1]
array[index - 1] = temp
}
}
}
return array
}
要检查,当数组被排序时,它使用:
func isSorted(array: [Int]) -> Bool {
for index in 1..<array.count {
if array[index - 1] > array[index] {
return false
}
}
return true
}
我使用http://swiftstub.com/编译代码,但它给了我以下错误消息:
<stdin>:17:17: error: '@lvalue $T11' is not identical to 'Int'
array[index] = array[index - 1]
^
<stdin>:18:17: error: '@lvalue $T8' is not identical to 'Int'
array[index - 1] = temp
^
(如果您想在网站上查看:http://swiftstub.com/385904096/)
array[index]
和array[index - 1]
如何不属于Int
类型,它们甚至可能属于不同类型?
答案 0 :(得分:1)
那是因为传递给函数的数组是不可变的。为了使其可变,您必须使用inout
修饰符通过引用传递它:
func bubbleSort(inout array: [Int]) -> [Int] {
请注意,使用inout
时,必须在调用函数时使用&
运算符将相应的参数作为引用传递:
let res = bubbleSort(&myArray)
另请注意,要交换2个变量,您只需使用:
swap(&array[index], &array[index - 1])
建议阅读:In-Out Parameters