Xcode Swift-[Int]不是@lvalue$T2的子类型
我试图在swift游乐场中执行简单的排序功能,但出现以下错误:Xcode Swift-[Int]不是@lvalue$T2的子类型,xcode,swift,swift-playground,Xcode,Swift,Swift Playground,我试图在swift游乐场中执行简单的排序功能,但出现以下错误: Playground execution failed: error: <EXPR>:20:22: error: '[Int]' is not a subtype of '@lvalue $T2' swap(&a,k,j) //Here in &a 以及排序功能: func sort(inout a:[Int]) -> [Int]{ var j = 0 var k = 0
Playground execution failed: error: <EXPR>:20:22: error: '[Int]' is not a subtype of '@lvalue $T2'
swap(&a,k,j) //Here in &a
以及排序功能:
func sort(inout a:[Int]) -> [Int]{
var j = 0
var k = 0
for (k = j ; k <= a.count; k++){
if(k != a.count){
if(a[k] < a[j]){
swap(&a,j,k)
}
}else{
j++;
k = j
}
}
return a
}
func sort(inout a:[Int])
sort(&arr)
println(arr)
中的本地参数
a
func sort(a:[Int])
默认情况下是一个常量。由于要修改传递的数组,因此
要以与swap()
函数相同的方式将该参数声明为inout
:
func sort(inout a:[Int]) -> [Int]{
var j = 0
var k = 0
for (k = j ; k <= a.count; k++){
if(k != a.count){
if(a[k] < a[j]){
swap(&a,j,k)
}
}else{
j++;
k = j
}
}
return a
}
func sort(inout a:[Int])
sort(&arr)
println(arr)
此外,传递的数组必须是可变的:
当它作为参数传递时,必须在它前面加上符号and
对于in-out参数,表示该参数可由函数修改:
func sort(inout a:[Int]) -> [Int]{
var j = 0
var k = 0
for (k = j ; k <= a.count; k++){
if(k != a.count){
if(a[k] < a[j]){
swap(&a,j,k)
}
}else{
j++;
k = j
}
}
return a
}
func sort(inout a:[Int])
sort(&arr)
println(arr)
还请注意
print ("\(sort(arr)) is the array")
不打印数组结果,因为
sort()
没有返回值。是的,这就是解决方案,我的数组被指定为常量(将其更改为var),通过传递其地址,它工作了。是的,我还添加了一个返回值并更正了排序。马上,但是要学究的话:传递&arr
不会传递arr
的地址-它只是将arr
包装为inout
表达式,以便与inout
函数参数一起使用。Swift中没有直接的内存地址引用。@rickster:你完全正确,谢谢我认为在某些情况下,地址是被接受的,例如,当作为参数传递给UnsafeMutablePointer参数时,但这不适用于这里。对——处理原始内存地址是一种(特殊情况)库功能,而不是核心语言功能。(另一方面,super secretinout
菜单包含类似于能够交换计算属性的值这样的处理—绝对不是指针的东西。)新的sort()函数对传递的数组进行排序并返回它。通常,您可以对传递的数组进行排序并不返回任何内容,或者保持传递的数组不变并返回已排序的数组。在第二种情况下,不需要inout参数。