web-dev-qa-db-ja.com

Swift配列の要素を交換するには?

次のような単純な配列が1つあります。

var cellOrder = [1,2,3,4]

2番目の要素を最初の要素と仮定するような要素を交換したい。

結果は次のようになります。

[2,1,3,4]

exchangeObjectAtIndexNSMutableArrayとともに使用できることはわかっていますが、Swift配列を使用します。Swift = [Int]配列?

33
Dharmesh

swapを使用:

var cellOrder = [1,2,3,4]
swap(&cellOrder[0], &cellOrder[1])

または、Tupleとして割り当てることもできます。

(cellOrder[0], cellOrder[1]) = (cellOrder[1], cellOrder[0])
60
Rob Napier

Swift 4

swapAt(_:_:)

cellOrder.swapAt(index0, index1)
43
hstdt

1つのオプションは次のとおりです。

cellOrder[0...1] = [cellOrder[1], cellOrder[0]]
7
Hermann Klecker

詳細

  • Xcodeバージョン10.3(10G8)、Swift 5

ベース(安全ではないが高速)バリアント

nsafe-配列内の要素の間違った(範囲外の)インデックスを使用してスワップしようとすると、致命的なエラーをキャッチできることを意味します

_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]
_
0

SwapAtメソッドを使用して、

var arr = [10,20,30,40,50]
arr.swapAt(2, 3)

インデックスを使用して要素を交換します。