【问题标题】:How to exchange elements in swift array?如何交换swift数组中的元素?
【发布时间】:2015-11-03 17:47:40
【问题描述】:

我有一个简单的数组,例如:

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

我想交换元素,比如假设第二个元素与第一个元素。

结果将是:

[2,1,3,4]

我知道我们可以使用 exchangeObjectAtIndexNSMutableArray 但我想使用 swift 数组。有什么方法可以用 swift [Int] 数组做同样的事情?

【问题讨论】:

标签: ios arrays swift nsmutablearray


【解决方案1】:

使用swap:

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

或者,您可以将其分配为元组:

(cellOrder[0], cellOrder[1]) = (cellOrder[1], cellOrder[0])

【讨论】:

  • 在 swift 4 中现在是 swapAt
  • swapAt 是一个不同的函数,它采用索引而不是 inout 值。它也可以用来解决这个问题,但不能替代swap(在 Swift 4 中仍然存在)。
  • 我在实施这个答案时遇到了问题。我在尝试换出值时遇到了这个特殊错误。 “同时访问0x108e19918,但修改需要独占访问。”使用 swap 对我来说效果更好。
  • 为了扩展上面的人所说的内容,而不是在 Swift 4 中执行 'swap(&cellOrder[0], &cellOrder[1])' 你现在将执行 'swapAt(0, 1)' ,所以现在更简单了。 @RobNapier 的第二个解决方案仍然适用于 Swift 4:您仍然可以通过将其分配为元组来完成工作。
  • @Honey 任何不是集合的情况。 swap(&x, &y).
【解决方案2】:

斯威夫特 4

swapAt(_:_:):

cellOrder.swapAt(index0, index1)

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • @basvk 我认为它回答了这个问题——它展示了如何从数组中“交换两个元素”。这是对问题的有效答案(也是正确的)。
  • @basvk 感谢您的建议。要回答这个问题,cellOrder.swapAt(0, 1)应该更好理解。还要感谢@Zizouz212。
  • 是的,这是 swift 4.0 版本的有效答案。
【解决方案3】:

一个选项是:

cellOrder[0...1] = [cellOrder[1], cellOrder[0]]

【讨论】:

    【解决方案4】:

    详情

    • Xcode 版本 10.3 (10G8),Swift 5

    基础(不安全但快速)变体

    不安全 - 意味着当您尝试使用数组中元素的错误(超出范围)索引进行交换时,您可能会遇到致命错误

    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]
    

    【讨论】:

      【解决方案5】:

      使用 swapAt 方法,

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

      使用索引交换元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-27
        相关资源
        最近更新 更多