我可以使用一个函数来交换数组的前两个元素:
requests
这实际上可行,但是我尝试过类似的操作,有时它们似乎不稳定。 同样,需要注意编译器警告。 我该如何实现:array2.swapFirstTwo2()而不会收到警告/错误?
答案 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]