Update: По Swift 3,2/4 (Xcode 9) вы должны использовать метод swapAt()
на В коллекции
scatola.swapAt(fromIndexPath.row, toIndexPath.row)
, потому что передача массива в виде двух различных inout
аргументов в такая же функция больше не является законной, сравнить SE-0173 Add MutableCollection.swapAt(_:_:)
).
Update: Я тестировал код снова Xcode 6.4, и проблема не происходит больше. Он компилируется и работает так, как ожидалось.
(Старый ответ :) Я предполагаю, что scatola
хранимое свойство в контроллере представления:
var scatola : [Int] = []
Вашей проблема, как представляется, связана с обсуждаемой проблемой в https://devforums.apple.com/thread/240425. Это уже может быть воспроизведена с: выход
class MyClass {
var array = [1, 2, 3]
func foo() {
swap(&array[0], &array[1])
}
}
Компилятор:
error: inout writeback to computed property 'array' occurs in multiple arguments to call, introducing invalid aliasing
swap(&array[0], &array[1])
^~~~~~~~
note: concurrent writeback occurred here
swap(&array[0], &array[1])
^~~~~~~~
Я еще не постиг содержание дискуссии полностью (слишком поздно здесь :), но есть один предложил «обходной путь», а именно, чтобы отметить собственность в качестве окончательного (так что вы не можете изменить его в подклассе):
final var scatola : [Int] = []
Другой обходной путь, который я нашел, чтобы получить указатель на подстилающей хранения массива:
scatola.withUnsafeMutableBufferPointer { (inout ptr:UnsafeMutableBufferPointer<Int>) -> Void in
swap(&ptr[fromIndexPath.row], &ptr[toIndexPath.row])
}
Конечно, дурак доказательство решение будет просто
let tmp = scatola[fromIndexPath.row]
scatola[fromIndexPath.row] = scatola[toIndexPath.row]
scatola[toIndexPath.row] = tmp
Покажите нам декларацию 'scatola'. –
var scatola: [String] = [] – Enlil