2014-10-29 35 views
4

我有下面的代碼簡單段:在迅速奇怪的行爲分配功能給一個變量

func swapper(var arr: [Int]) { 
    let first: Int = arr[0] 
    let last: Int = arr[arr.count - 1] 
    arr[0] = last 
    arr[arr.count - 1] = first 
    arr 
} 
var myFunctionPointer : ([Int]) ->() = swapper 

它運作良好,但是當我嘗試INOUT添加到方法的參數的簽名我是無法像以下那樣將其分配給外部變量。

func swapper(inout arr: [Int]){ 
    let first: Int = arr[0] 
    let last: Int = arr[arr.count - 1] 
    arr[0] = last 
    arr[arr.count - 1] = first 
    arr 
} 
var myFunctionPointer: ([Int]) ->() = swapper // This failed [int] is not subtype of inout [Int] 
var myFunctionPointer: (inout[Int]) ->() = swapper // I am not getting a compilation error, but the playground keeps showing an error message and everything stopped working 

我正在使用Xcode 6.1 Playground。

第二種方式是正確的方式,但Xcode有一個錯誤? 有什麼想法?

+0

好像對我的錯誤。 – 2014-10-29 14:07:47

回答

6

這似乎是在操場上的錯誤。它在一個項目中工作沒有問題。

它可以簡化,但(我知道這可能是不是你真正的代碼,但它提供了更好的方法一個很好的例子):

func swapper(inout arr: [Int]){ 
    (arr[0], arr[arr.count - 1]) = (arr[arr.count - 1], arr[0]) 
} 

//let myFunctionPointer : (inout [Int])->Void = swapper 
let myFunctionPointer = swapper // There's no real reason for a type here 

var x = [1,2,3] 
myFunctionPointer(&x) 
println(x) 

注意,讓arr在你的函數結束這不是一個好習慣。 Swift不會返回最後一次計算的值,所以這行不做任何事情(但會造成一些混淆)。


編輯:實際上,它甚至可以比簡單一些(我不知道這會工作,直到我試了一下):

func swapper(inout arr: [Int]){ 
    swap(&arr[0], &arr[arr.count-1]) 
} 
+0

感謝您的回答,我很欣賞關於代碼的建議,關於arr我放在我的代碼的結尾,它只是看到輸出在操場的正確部分,我想我可能會開始一個新的問題你的建議,因爲老實說,我不明白它的工作原理。 – 2014-10-31 20:45:59

2

第二個版本使用正確的語法。

這是一個Xcode錯誤/問題 - 我每次保存在遊樂場時都會重複發送Error running playgroundCommunication with the playground service was interrupted unexpectedly通知。我不知道如果這是一個反覆出現的問題,但如果你在函數聲明與var取代inout並從封閉聲明刪除inout,它的工作原理 -

它看起來像遊樂場使用時inout有問題。 免責聲明:這只是一個操場驗證測試,而不是一個解決方案