IT story

Swift에서 배열에서 요소를 제거하는 방법

hot-time 2020. 5. 9. 09:20
반응형

Swift에서 배열에서 요소를 제거하는 방법


Apple의 새로운 언어 Swift에서 배열에서 요소를 설정 해제 / 제거하려면 어떻게해야합니까?

코드는 다음과 같습니다.

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

animals[2]배열에서 요소를 어떻게 제거 할 수 있습니까?


let키워드는 변경할 수없는 상수를 선언하는 것입니다. 변수를 수정하려면 var대신 다음을 사용해야 합니다.

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

animals.remove(at: 2)  //["cats", "dogs", "moose"]

원본 컬렉션을 변경하지 않고 변경하지 않는 대안은 filter다음과 같이 제거하려는 요소없이 새 컬렉션을 만드는 것입니다.

let pets = animals.filter { $0 != "chimps" }

주어진

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

첫 번째 요소 제거

animals.removeFirst() // "cats"
print(animals)        // ["dogs", "chimps", "moose"]

마지막 요소 제거

animals.removeLast() // "moose"
print(animals)       // ["cats", "dogs", "chimps"]

색인에서 요소 제거

animals.remove(at: 2) // "chimps"
print(animals)           // ["cats", "dogs", "moose"]

알 수없는 색인의 요소 제거

하나의 요소 만

if let index = animals.index(of: "chimps") {
    animals.remove(at: index)
}
print(animals) // ["cats", "dogs", "moose"]

여러 요소

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

animals = animals.filter(){$0 != "chimps"}
print(animals) // ["cats", "dogs", "moose"]

또는 대안으로

animals.index(of: "chimps").map { animals.remove(at: $0) }

노트

  • 위의 메소드는 배열을 제자리에서 수정하고 (제외 filter) 제거 된 요소를 반환합니다.
  • 맵 필터 감소에 대한 신속한 가이드
  • 원래 배열을 수정하지 않으려면 dropFirst또는 dropLast새 배열을 사용 하거나 만들 수 있습니다 .

스위프트 3으로 업데이트


위의 답변은 삭제하려는 요소의 색인을 알고 있다고 가정합니다.

종종 배열에서 삭제하려는 객체에 대한 참조알고 있습니다. (예를 들어 배열을 반복하고 찾아낸 경우 등) 이러한 경우 인덱스를 어디서나 전달하지 않고도 객체 참조로 직접 작업하는 것이 더 쉬울 수 있습니다. 따라서이 솔루션을 제안합니다. 그것은 사용 신원 연산자 !== 는 두 개의 객체 참조가 모두 동일한 개체의 인스턴스를 참조하는지 여부를 테스트에 사용합니다.

func delete(element: String) {
    list = list.filter() { $0 !== element }
}

물론 이것은 단지 Strings를 위해 작동하지 않습니다 .


스위프트 4 : 필터링없이 배열에서 요소를 제거하는 시원하고 쉬운 확장입니다.

   extension Array where Element: Equatable {

    // Remove first collection element that is equal to the given `object`:
    mutating func remove(object: Element) {
        guard let index = index(of: object) else {return}
        remove(at: index)
    }

}

사용법 :

var myArray = ["cat", "barbecue", "pancake", "frog"]
let objectToRemove = "cat"

myArray.remove(object: objectToRemove) // ["barbecue", "pancake", "frog"]

또한 일반적인 유형 Int이므로 다른 유형과도 작동 Element합니다.

var myArray = [4, 8, 17, 6, 2]
let objectToRemove = 17

myArray.remove(object: objectToRemove) // [4, 8, 6, 2]

Swift4의 경우 :

list = list.filter{$0 != "your Value"}

스위프트의 어레이와 관련된 몇 가지 작업

배열 만들기

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

배열에 객체 추가

stringArray = stringArray + ["Five"]

Index 객체에서 값 가져 오기

let x = stringArray[1]

개체 추가

stringArray.append("At last position")

인덱스에 객체 삽입

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

객체 제거

stringArray.removeAtIndex(3)

연결 객체 값

var string = "Concate Two object of Array \(stringArray[1]) + \(stringArray[2])"

당신은 그렇게 할 수 있습니다. 먼저 Dog배열에 실제로 존재 하는지 확인한 다음 제거하십시오. 어레이에서 두 번 이상 발생할 for수 있다고 생각 되면 명령문을 추가하십시오 Dog.

var animals = ["Dog", "Cat", "Mouse", "Dog"]
let animalToRemove = "Dog"

for object in animals
{
    if object == animalToRemove{
        animals.removeAtIndex(animals.indexOf(animalToRemove)!)
    }
}

Dog배열에서 종료하고 단 한 번만 발생한 경우 다음을 수행하십시오 .

animals.removeAtIndex(animals.indexOf(animalToRemove)!)

문자열과 숫자가 모두있는 경우

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.removeAtIndex(array.indexOf(numberToRemove)!)
        }
    }
    if object is String
    {
        // this will deal with strings
        if object == animalToRemove
        {
        array.removeAtIndex(array.indexOf(animalToRemove)!)
        }
    }
}

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.


If you don't know the index of the element that you want to remove, and the element is conform the Equatable protocol, you can do:

animals.removeAtIndex(animals.indexOf("dogs")!)

See Equatable protocol answer:How do I do indexOfObject or a proper containsObject


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"]
    

Regarding @Suragch's Alternative to "Remove element of unknown index":

There is a more powerful version of "indexOf(element)" that will match on a predicate instead of the object itself. It goes by the same name but it called by myObjects.indexOf{$0.property = valueToMatch}. It returns the index of the first matching item found in myObjects array.

If the element is an object/struct, you may want to remove that element based on a value of one of its properties. Eg, you have a Car class having car.color property, and you want to remove the "red" car from your carsArray.

if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) {
  carsArray.removeAtIndex(validIndex)
}

Foreseeably, you could rework this to remove "all" red cars by embedding the above if statement within a repeat/while loop, and attaching an else block to set a flag to "break" out of the loop.


This should do it (not tested):

animals[2..3] = []

Edit: and you need to make it a var, not a let, otherwise it's an immutable constant.


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.removeAtIndex(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]

If you have array of custom Objects, you can search by specific property like this:

    if let index = doctorsInArea.indexOf({$0.id == doctor.id}){
        doctorsInArea.removeAtIndex(index)
    }

or if you want to search by name for example

    if let index = doctorsInArea.indexOf({$0.name == doctor.name}){
        doctorsInArea.removeAtIndex(index)
    }

extension to remove String object

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

I use this extension, almost same as Varun's, but this one (below) is all-purpose:

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

참고URL : https://stackoverflow.com/questions/24051633/how-to-remove-an-element-from-an-array-in-swift

반응형