Причина, по которой вы получаете предупреждение (и вскоре будет ошибка в режиме 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
вне окна, в котором он действителен.
Эта проблема будет исправлена , если / когда не примененные методы экземпляра получат плоские подписи , так как 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]