Подтвердить что ты не робот

Как удалить элемент заданного значения из массива в Swift

Я хочу удалить все элементы значения x из массива, содержащего элементы x, y и z

let arr = ['a', 'b', 'c', 'b']

Как удалить все элементы значения 'b' из arr?

4b9b3361

Ответ 1

Фильтр:

 let farray = arr.filter {$0 != "b"} 

Ответ 2

var array : [String]
array = ["one","two","one"]

let itemToRemove = "one"

while array.contains(itemToRemove) {
    if let itemToRemoveIndex = array.index(of: itemToRemove) {
        array.remove(at: itemToRemoveIndex)
    }
}

print(array)

Работает на Swift 3.0.

Ответ 3

Отредактировано в соответствии с комментариями:

Мне нравится такой подход:

var arr = ["a", "b", "c", "b"]

while let idx = arr.index(of:"b") {
    arr.remove(at: idx)
}

Исходный ответ (до редактирования):

let arr = ['a', 'b', 'c', 'b']

if let idx = arr.index(of:"b") {
    arr.remove(at: idx)
}

Ответ 4

В Swift 3 я просто делаю:

arr = arr.filter { $0 != "a" } 

.filter,.sort и .map отлично подходят для экономии времени и решения множества проблем с небольшим кодом.

В этой статье приводятся хорошие примеры и объясняются различия и способы их работы: https://useyourloaf.com/blog/swift-guide-to-map-filter-reduce/

Ответ 5

Если вам нужно изменить исходный массив, вы можете использовать функцию removeAll(where:), которая доступна в Swift 4.2/Xcode 10:

var arr = ["a", "b", "c", "b"]
arr.removeAll(where: { $0 == "b" })
print(arr) // output is ["a", "c"]

Однако, если вы используете Xcode 9, вы можете найти эту функцию в Xcode9to10Preparation (эта библиотека предоставляет реализации некоторых новых функций из Xcode 10).

Ответ 6

Общий подход заключается в использовании процедур первого класса. (Тем не менее, этот подход гораздо более мощный, чем то, что требуется для вашего вопроса.) Чтобы проиллюстрировать, скажем, вы хотите избежать "Джастина" несколько раз во многих коллекциях.

let avoidJustin = notEqualTester ("Justin")

let arrayOfUsers = // ...

arrayOfUsers.filter (avoidJustin)

let arrayOfFriends = // ...

arrayOfFriends.filter (avoidJustin)

При этом вы избегаете многократного создания закрытия каждый раз, когда хотите избежать Джастина. Здесь notEqualTester, который при a that возвращает функцию this, которая возвращает this != that.

func notEqualTester<T: Equatable> (that:T) -> ((this:T) -> Bool) {
  return { (this:T) -> Bool in return this != that }
}

Возвращаемое закрытие для this фиксирует значение для that - которое может быть полезно, когда that больше не доступно.

Ответ 7

Если вам нужно удалить более одного элемента, спасибо за первый ответ.

 var mainArray = ["a", "b", "qw", "qe"]
 let thingsToRemoveArray = ["qw", "b"] 


        for k in thingsToRemoveArray {
            mainArray =  mainArray.filter {$0 != k}
          }