以快速奇怪的行为为变量赋值

时间:2014-10-29 13:59:39

标签: swift swift-playground

我有以下简单的代码段:

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有错误? 有什么想法吗?

2 个答案:

答案 0 :(得分: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])
}

答案 1 :(得分:2)

第二个版本使用正确的语法。

这是一个Xcode错误/问题 - 每次我在操场上保存时,我都会重复Error running playgroundCommunication with the playground service was interrupted unexpectedly次通知。

使用inout时,操场看起来有问题 - 我不知道这是否是一个反复出现的问题,但如果您将inout替换为var函数声明并从闭包声明中删除inout,它的工作原理。 免责声明:这只是游乐场验证测试,而非解决方案