2014-09-12 53 views
1

我試圖做一個簡單的排序功能以迅速操場,但我得到了以下錯誤:

Playground execution failed: error: <EXPR>:20:22: error: '[Int]' is not a subtype of '@lvalue $T2' 
      swap(&a,k,j) //Here in &a 

我寫了下面的代碼:

let arr:[Int] = [1,3,53,24,52,1,234,5,3] 

func swap(inout a:[Int], num1:Int, num2:Int){ 
    var value = a[num1] 
    a[num1] = a[num2] 
    a[num2] = value 
} 

func sort(a:[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,k,j) 
      } 
     }else{ 
      j++; 
     } 
    } 
} 

print ("\(sort(arr)) is the array") 

任何想法爲什麼這不起作用?我不正確地引用陣列,謝謝!

UPDATE: 正如馬丁 - [R指出了錯誤,這裏是更正後的代碼:

var arr:[Int] = [1,3,53,24,52,1,234,5,3] 

以及排序功能:

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 
} 

最後:

print ("\(sort(&arr)) is the array") 
+0

您的新sort()函數對傳遞的數組* *進行排序並返回它。通常你要麼排序傳遞的數組,並且不返回任何內容*或*保持傳遞的數組不變,並返回一個有序數組。在第二種情況下,您不需要inout參數。 – 2014-09-12 20:04:45

回答

2

的當地參數a in

func sort(a:[Int]) 

默認爲常數。既然你要修改的傳遞的數組,你有 以同樣的方式來聲明參數作爲inoutswap()功能:

func sort(inout a:[Int]) 

而且,傳遞的數組必須是可變

var arr:[Int] = [1,3,53,24,52,1,234,5,3] 

,你必須用符號前綴它時,它作爲一個參數傳遞 爲in-out參數,以表明它可通過函數修改:

sort(&arr) 
println(arr) 

還要注意

print ("\(sort(arr)) is the array") 

不打印陣列的結果,因爲sort()沒有返回值。

+0

是的,這是解決方案,我的數組被指定爲一個常量(將其更改爲var),並通過傳遞它的地址,它的工作和是的,我還添加了一個返回,並糾正了排序。 – romsearcher 2014-09-12 18:52:02

+2

對,但是要迂迴:傳遞'&arr'不會傳遞'arr'的地址 - 它只是將'arr'作爲'inout'表達式來包裝,以便與'inout'函數參數一起使用。在Swift中沒有直接的內存地址引用。 – rickster 2014-09-12 18:57:28

+0

@ rickster:你完全正確,謝謝。 - 我認爲有些情況下,地址是被採取的,例如當作爲參數傳遞給UnsafeMutablePointer參數時,但在此不適用。 – 2014-09-12 19:10:21