답변:
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.firstIndex(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"]
filter
) 제거 된 요소를 반환합니다.dropFirst
또는 dropLast
새 배열을 사용 하거나 만들 수 있습니다 .스위프트 5.2로 업데이트
위의 답변은 삭제하려는 요소의 색인을 알고 있다고 가정합니다.
종종 배열에서 삭제하려는 객체에 대한 참조 를 알고 있습니다. (예를 들어 배열을 반복하고 찾아낸 경우 등) 이러한 경우 인덱스를 어디서나 전달하지 않고도 객체 참조로 직접 작업하는 것이 더 쉬울 수 있습니다. 따라서이 솔루션을 제안합니다. 그것은 사용 신원 연산자 !==
는 두 개의 객체 참조가 모두 동일한 개체의 인스턴스를 참조하는지 여부를 테스트에 사용합니다.
func delete(element: String) {
list = list.filter() { $0 !== element }
}
물론 이것은 단지 String
s를 위해 작동하지 않습니다 .
list = list.filter({ $0 != element })
array.indexOf({ $0 == obj })
list
경우이 삭제는 새 배열을에 할당하므로 다른 배열 참조를 업데이트하지 않습니다 list
. 이 방법으로 배열에서 삭제하면 미묘한 의미가 있습니다.
스위프트 5 : 필터링없이 배열에서 요소를 제거하는 시원하고 쉬운 확장입니다.
extension Array where Element: Equatable {
// Remove first collection element that is equal to the given `object`:
mutating func remove(object: Element) {
guard let index = firstIndex(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"}
Xcode 10+부터 WWDC 2018 세션 223, "Embracing Algorithms" 에 따르면 앞으로 좋은 방법은 다음과 같습니다.mutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
애플의 예 :
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."
Apple의 설명서를 참조하십시오
OP의 예에서, 동물을 제거하는 것 [2], "침팬지":
var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeAll(where: { $0 == "chimps" } )
// or animals.removeAll { $0 == "chimps" }
이 방법은 확장 성이 좋고 (선형 대 2 차) 읽기 쉽고 깨끗하기 때문에 선호 될 수 있습니다. Xcode 10 이상에서만 작동하며 작성 당시 베타 버전입니다.
스위프트의 어레이와 관련된 몇 가지 작업
배열 만들기
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)!)
}
}
}
제거하려는 요소의 색인을 모르고 요소가 Equatable 프로토콜을 따르는 경우 다음을 수행 할 수 있습니다.
animals.removeAtIndex(animals.indexOf("dogs")!)
적분 프로토콜 답변 : indexOfObject 또는 올바른 containsObject를 수행하는 방법을 참조하십시오.
인덱스 배열을 사용하여 요소를 제거하십시오.
문자열과 인덱스의 배열
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]
다른 배열의 요소 값을 사용하여 요소 제거
정수 배열
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"]
"알 수없는 색인의 요소 제거"에 대한 @Suragch의 대안과 관련하여 :
"indexOf (element)"의 더 강력한 버전이 객체 자체 대신 술어와 일치합니다. 이름은 동일하지만 myObjects.indexOf {$ 0.property = valueToMatch}에 의해 호출됩니다. myObjects 배열에서 처음으로 일치하는 항목의 색인을 리턴합니다.
요소가 객체 / 구조 인 경우 속성 중 하나의 값을 기준으로 해당 요소를 제거 할 수 있습니다. 예를 들어, car.color 속성을 가진 Car 클래스가 있고 carsArray에서 "빨간색"자동차를 제거하려고합니다.
if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) {
carsArray.removeAtIndex(validIndex)
}
아마도 반복 / while 루프 내에 위의 if 문을 포함시키고 else 블록을 연결하여 루프에서 "break"플래그를 설정하여 "모든"빨간 자동차를 제거하기 위해이 작업을 다시 수행 할 수 있습니다.
구현 Array
의 요소를 가정하고 에서 확장 요소를 처리하는 다음 확장을 생각해 냈습니다 .Array
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)
}
}
var test1 = [1, 2, 1, 2]
test1.removeEqualItems(2) // [1, 1]
var test2 = [1, 2, 1, 2]
test2.removeFirstEqualItem(2) // [1, 1, 2]
String 객체를 제거하는 확장
extension Array {
mutating func delete(element: String) {
self = self.filter() { $0 as! String != element }
}
}
remove
제거 된 요소를 반환합니다.let animal = animals.remove(at: 2)