Я хочу удалить все элементы значения x из массива, содержащего элементы x, y и z
let arr = ['a', 'b', 'c', 'b']
Как удалить все элементы значения 'b' из arr?
Я хочу удалить все элементы значения x из массива, содержащего элементы x, y и z
let arr = ['a', 'b', 'c', 'b']
Как удалить все элементы значения 'b' из arr?
Фильтр:
let farray = arr.filter {$0 != "b"}
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.
Отредактировано в соответствии с комментариями:
Мне нравится такой подход:
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)
}
В Swift 3 я просто делаю:
arr = arr.filter { $0 != "a" }
.filter,.sort и .map отлично подходят для экономии времени и решения множества проблем с небольшим кодом.
В этой статье приводятся хорошие примеры и объясняются различия и способы их работы: https://useyourloaf.com/blog/swift-guide-to-map-filter-reduce/
Если вам нужно изменить исходный массив, вы можете использовать функцию 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).
Общий подход заключается в использовании процедур первого класса. (Тем не менее, этот подход гораздо более мощный, чем то, что требуется для вашего вопроса.) Чтобы проиллюстрировать, скажем, вы хотите избежать "Джастина" несколько раз во многих коллекциях.
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
больше не доступно.
Если вам нужно удалить более одного элемента, спасибо за первый ответ.
var mainArray = ["a", "b", "qw", "qe"]
let thingsToRemoveArray = ["qw", "b"]
for k in thingsToRemoveArray {
mainArray = mainArray.filter {$0 != k}
}