How to remove an element from an array in Swift

后端 未结 18 2088
灰色年华
灰色年华 2020-11-28 18:38

How can I unset/remove an element from an array in Apple\'s new language Swift?

Here\'s some code:

let animals = [\"cats\", \"dogs\", \"chimps\", \"m         


        
相关标签:
18条回答
  • 2020-11-28 18:49

    I came up with the following extension that takes care of removing elements from an Array, assuming the elements in the Array implement Equatable:

    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)
      }
      
    }
      
    

    Usage:

    var test1 = [1, 2, 1, 2]
    test1.removeEqualItems(2) // [1, 1]
    
    var test2 = [1, 2, 1, 2]
    test2.removeFirstEqualItem(2) // [1, 1, 2]
    
    0 讨论(0)
  • 2020-11-28 18:51

    Few Operation relates to Array in Swift

    Create Array

    var stringArray = ["One", "Two", "Three", "Four"]
    

    Add Object in Array

    stringArray = stringArray + ["Five"]
    

    Get Value from Index object

    let x = stringArray[1]
    

    Append Object

    stringArray.append("At last position")
    

    Insert Object at Index

    stringArray.insert("Going", at: 1)
    

    Remove Object

    stringArray.remove(at: 3)
    

    Concat Object value

    var string = "Concate Two object of Array \(stringArray[1]) + \(stringArray[2])"
    
    0 讨论(0)
  • 2020-11-28 18:52

    You could do that. First make sure Dog really exists in the array, then remove it. Add the for statement if you believe Dog may happens more than once on your array.

    var animals = ["Dog", "Cat", "Mouse", "Dog"]
    let animalToRemove = "Dog"
    
    for object in animals {
        if object == animalToRemove {
            animals.remove(at: animals.firstIndex(of: animalToRemove)!)
        }
    }
    

    If you are sure Dog exits in the array and happened only once just do that:

    animals.remove(at: animals.firstIndex(of: animalToRemove)!)
    

    If you have both, strings and numbers

    var array = [12, 23, "Dog", 78, 23]
    let numberToRemove = 23
    let animalToRemove = "Dog"
    
    for object in array {
    
        if object is Int {
            // this will deal with integer. You can change to Float, Bool, etc...
            if object == numberToRemove {
            array.remove(at: array.firstIndex(of: numberToRemove)!)
            }
        }
        if object is String {
            // this will deal with strings
            if object == animalToRemove {
            array.remove(at: array.firstIndex(of: animalToRemove)!)
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 18:55

    As of Xcode 10+, and according to the WWDC 2018 session 223, "Embracing Algorithms," a good method going forward will be mutating func removeAll(where predicate: (Element) throws -> Bool) rethrows

    Apple's example:

    var phrase = "The rain in Spain stays mainly in the plain."
    let vowels: Set<Character> = ["a", "e", "i", "o", "u"]
    
    phrase.removeAll(where: { vowels.contains($0) })
    // phrase == "Th rn n Spn stys mnly n th pln."
    

    see Apple's Documentation

    So in the OP's example, removing animals[2], "chimps":

    var animals = ["cats", "dogs", "chimps", "moose"]
    animals.removeAll(where: { $0 == "chimps" } )
    // or animals.removeAll { $0 == "chimps" }
    

    This method may be preferred because it scales well (linear vs quadratic), is readable and clean. Keep in mind that it only works in Xcode 10+, and as of writing this is in Beta.

    0 讨论(0)
  • 2020-11-28 18:55

    Remove elements using indexes array:

    1. Array of Strings and indexes

      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"]
      
    2. Array of Integers and indexes

      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]
      



    Remove elements using element value of another array

    1. Arrays of integers

      let arrayResult = numbers.filter { element in
          return !indexesToRemove.contains(element)
      }
      print(arrayResult)
      
      //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
      
    2. Arrays of strings

      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"]
      
    0 讨论(0)
  • 2020-11-28 18:55

    Swift 5

    guard let index = orders.firstIndex(of: videoID) else { return }
    orders.remove(at: index)
    
    0 讨论(0)
提交回复
热议问题