如何在Swift中从数组中删除一个元素

318

如何在苹果的新语言Swift中从数组中取消设置/删除元素?

以下是一些代码:

let animals = ["cats", "dogs", "chimps", "moose"]

如何从数组中删除元素animals[2]

18个回答

11

使用索引数组删除元素:

  1. 字符串和索引数组

let animals = ["cats", "dogs", "chimps", "moose", "squarrel", "cow"]
let indexAnimals = [0, 3, 4]
let arrayRemainingAnimals = animals
    .enumerated()
    .filter { !indexAnimals.contains($0.offset) }
    .map { $0.element }

print(arrayRemainingAnimals)

//result - ["dogs", "chimps", "cow"]
  • 整数和索引的数组

  • var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    let indexesToRemove = [3, 5, 8, 12]
    
    numbers = numbers
        .enumerated()
        .filter { !indexesToRemove.contains($0.offset) }
        .map { $0.element }
    
    print(numbers)
    
    //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
    



    使用另一个数组的元素值来删除元素

    1. 整数数组

    let arrayResult = numbers.filter { element in
        return !indexesToRemove.contains(element)
    }
    print(arrayResult)
    
    //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
    
  • 字符串数组

  • let arrayLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
    let arrayRemoveLetters = ["a", "e", "g", "h"]
    let arrayRemainingLetters = arrayLetters.filter {
        !arrayRemoveLetters.contains($0)
    }
    
    print(arrayRemainingLetters)
    
    //result - ["b", "c", "d", "f", "i"]
    

    4
    这是一个简短的答案,对于更好的编码和快速执行非常有效。 - The iOSDev
    嗨@Krunal - 很棒的答案,你能看一下以下问题吗(释放图像数组中的图像):https://dev59.com/j6fja4cB1Zd3GeqPvGfa - Server Programmer

    9
    我设计了下面这个扩展,用来从一个实现了EquatableArray中删除元素:
    extension Array where Element: Equatable {
      
      mutating func removeEqualItems(_ item: Element) {
        self = self.filter { (currentItem: Element) -> Bool in
          return currentItem != item
        }
      }
    
      mutating func removeFirstEqualItem(_ item: Element) {
        guard var currentItem = self.first else { return }
        var index = 0
        while currentItem != item {
          index += 1
          currentItem = self[index]
        }
        self.remove(at: index)
      }
      
    }
      
    

    用法:

    var test1 = [1, 2, 1, 2]
    test1.removeEqualItems(2) // [1, 1]
    
    var test2 = [1, 2, 1, 2]
    test2.removeFirstEqualItem(2) // [1, 1, 2]
    

    嗨 @nburk - 回答得非常好,你能不能看一下以下问题(释放图像数组中的图像):https://dev59.com/j6fja4cB1Zd3GeqPvGfa - Server Programmer
    这是最干净的解决方案。 - JIANG
    如果数组不包含该项,则在removeFirstEqualItem方法中self[index]将失败。 - Confused

    7
    关于@Suragch的“删除未知索引元素”的替代方法:
    有一种更强大的“indexOf(element)”版本,可以基于谓词而不是对象本身进行匹配。它使用相同的名称,但通过myObjects.indexOf {$0.property = valueToMatch}调用。它返回在myObjects数组中找到的第一个匹配项的索引。
    如果元素是对象/结构体,则可能希望根据其属性之一的值删除该元素。例如,您拥有具有car.color属性的Car类,并且您想从carsArray中删除“red”汽车。
    if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) {
      carsArray.removeAtIndex(validIndex)
    }
    

    可以预见,您可以通过在重复/while循环中嵌入上述if语句,并附加else块来设置一个标志以"break"退出循环,从而重新设计它以移除“所有”红色汽车。


    7

    Swift 5

    guard let index = orders.firstIndex(of: videoID) else { return }
    orders.remove(at: index)
    

    4
    这应该可以解决(未测试):
    animals[2...3] = []
    

    编辑:您需要将其更改为var,而不是let,否则它将是一个不可变的常量。


    5
    在使用一个已有数组的(子)范围来创建另一个数组时,范围需要用3个点。上述内容应写为animals[2...3]。 - zevij
    Array conforms to RangeReplaceableCollection protocol and it provides a method exactly for this purpose animals.removeSubrange(2...3) - Leo Dabus
    请注意,此答案中的代码会删除两个元素,即索引为2和3的元素。如果只想删除索引为2的元素,则可以使用2..<3. - Cristik

    2

    我使用这个扩展,几乎和Varun的一样,但是下面这个是通用的:

     extension Array where Element: Equatable  {
            mutating func delete(element: Iterator.Element) {
                    self = self.filter{$0 != element }
            }
        }
    

    2

    要从数组中移除元素,请使用remove(at:)removeLast()removeAll()方法。

    yourArray = [1,2,3,4]
    

    删除第2个位置的值

    yourArray.remove(at: 2)
    

    从数组中删除最后一个值

    yourArray.removeLast()
    

    从集合中删除所有成员

    yourArray.removeAll()
    

    2

    删除字符串对象的扩展程序

    extension Array {
        mutating func delete(element: String) {
            self = self.filter() { $0 as! String != element }
        }
    }
    

    1
    强制解包可能会导致崩溃,在这种情况下,我认为你应该避免使用它。 - user3206558
    什么是“mutating”函数? - user13507084
    这个用法通常用来表示该函数将会改变self(数组)。 - Varun Naharia

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接