Swift变异函数为一等值

时间:2018-11-01 23:07:54

标签: swift functional-programming mutating-function

我可以使用一个函数来交换数组的前两个元素:

requests

这实际上可行,但是我尝试过类似的操作,有时它们似乎不稳定。 同样,需要注意编译器警告。 我该如何实现:array2.swapFirstTwo2()而不会收到警告/错误?

1 个答案:

答案 0 :(得分:3)

在以下情况下收到警告(很快将成为Swift 5模式下的错误)的原因:

extension Array where Element == Int { 
  mutating func swapFirstTwo2() {
    if count >= 2 {
      swapAt(0, 1)
    }
  }
}

typealias Swapper2 = (inout [Int]) -> () -> ()
let swapThemAgain: Swapper2 = Array.swapFirstTwo2

由于inout参数仅在传递给它们的调用期间有效,因此不能部分应用。

因此,如果您要用(inout [Int]) -> () -> ()调用返回的&array2,则会返回一个() -> (),现在它对array2的引用无效。尝试调用该函数将产生未定义的行为,因为您正在尝试在有效窗口之外更改inout参数。

此问题将得到解决if/when unapplied instance methods get flat signatures,因为Array.swapFirstTwo2的结果将是(inout [Int]) -> ()

但是与此同时,您可以改用闭包来解决此问题:

typealias Swapper2 = (inout [Int]) -> ()
let swapThemAgain: Swapper2 = { $0.swapFirstTwo2() }

var array2 = [1,2,3]
print(array2) // [1, 2, 3]
array2.swapFirstTwo2()
print(array2) // [2, 1, 3]