Ответ 1
Используйте swap
:
var cellOrder = [1,2,3,4]
swap(&cellOrder[0], &cellOrder[1])
В качестве альтернативы вы можете просто назначить его как кортеж:
(cellOrder[0], cellOrder[1]) = (cellOrder[1], cellOrder[0])
У меня есть один простой массив:
var cellOrder = [1,2,3,4]
Я хочу обмениваться элементами, например, предполагать второй элемент с первым элементом.
И результат будет:
[2,1,3,4]
Я знаю, что мы можем использовать exchangeObjectAtIndex
с NSMutableArray
Но я хочу использовать быстрый массив. Любые способы сделать это с быстрым массивом [Int]
?
Используйте swap
:
var cellOrder = [1,2,3,4]
swap(&cellOrder[0], &cellOrder[1])
В качестве альтернативы вы можете просто назначить его как кортеж:
(cellOrder[0], cellOrder[1]) = (cellOrder[1], cellOrder[0])
Swift 4
cellOrder.swapAt(index0, index1)
Один из вариантов:
cellOrder[0...1] = [cellOrder[1], cellOrder[0]]
Используйте метод swapAt,
var arr = [10,20,30,40,50]
arr.swapAt(2, 3)
Используйте индекс для замены элемента.
unsafe - означает, что вы можете перехватить фатальную ошибку, когда попытаетесь произвести обмен, используя неверный (вне диапазона) индекс элемента в массиве
var array = [1,2,3,4]
// way 1
(array[0],array[1]) = (array[1],array[0])
// way 2
array.swapAt(2, 3)
print(array)
не используйте это решение, когда вам нужно поменять много элементов в цикле. Это решение проверяет оба (i, j) индекса (добавьте некоторую дополнительную логику) в функции подкачки, что сделает ваш код медленнее, чем использование стандарта
arr.swapAt(i,j)
. Это идеально подходит для одиночных свопов или для небольшого массива. Но если вы решите использовать стандартныйarr.swapAt(i,j)
, вам придется проверять индексы вручную или быть уверенным, что индексы не выходят за пределы диапазона.
import Foundation
enum SwapError: Error {
case wrongFirstIndex
case wrongSecondIndex
}
extension Array {
mutating func detailedSafeSwapAt(_ i: Int, _ j: Int) throws {
if !(0..<count ~= i) { throw SwapError.wrongFirstIndex }
if !(0..<count ~= j) { throw SwapError.wrongSecondIndex }
swapAt(i, j)
}
@discardableResult mutating func safeSwapAt(_ i: Int, _ j: Int) -> Bool {
do {
try detailedSafeSwapAt(i, j)
return true
} catch {
return false
}
}
}
result = arr.safeSwapAt(5, 2)
//or
if arr.safeSwapAt(5, 2) {
//Success
} else {
//Fail
}
//or
arr.safeSwapAt(4, 8)
//or
do {
try arr.detailedSafeSwapAt(4, 8)
} catch let error as SwapError {
switch error {
case .wrongFirstIndex: print("Error 1")
case .wrongSecondIndex: print("Error 2")
}
}
var arr = [10,20,30,40,50]
print("Original array: \(arr)")
print("\nSample 1 (with returning Bool = true): ")
var result = arr.safeSwapAt(1, 2)
print("Result: " + (result ? "Success" : "Fail"))
print("Array: \(arr)")
print("\nSample 2 (with returning Bool = false):")
result = arr.safeSwapAt(5, 2)
print("Result: " + (result ? "Success" : "Fail"))
print("Array: \(arr)")
print("\nSample 3 (without returning value):")
arr.safeSwapAt(4, 8)
print("Array: \(arr)")
print("\nSample 4 (with catching error):")
do {
try arr.detailedSafeSwapAt(4, 8)
} catch let error as SwapError {
switch error {
case .wrongFirstIndex: print("Error 1")
case .wrongSecondIndex: print("Error 2")
}
}
print("Array: \(arr)")
print("\nSample 5 (with catching error):")
do {
try arr.detailedSafeSwapAt(7, 1)
} catch let error as SwapError {
print(error)
}
print("Array: \(arr)")
Original array: [10, 20, 30, 40, 50]
Sample 1 (with returning Bool = true):
Result: Success
Array: [10, 30, 20, 40, 50]
Sample 2 (with returning Bool = false):
Result: Fail
Array: [10, 30, 20, 40, 50]
Sample 3 (without returning value):
Array: [10, 30, 20, 40, 50]
Sample 4 (with catching error):
Error 2
Array: [10, 30, 20, 40, 50]
Sample 5 (with catching error):
wrongFirstIndex
Array: [10, 30, 20, 40, 50]