ios - index - swift remove object from array




Удалить определенный элемент массива, равный строке-Swift (4)

Вы хотите использовать filter() . Если у вас есть один элемент (называемый say obj ) для удаления, то предикатом filter() будет { $0 != obj } . Если вы делаете это несколько раз для большого массива, это может быть проблемой производительности. Если вы можете отложить удаление отдельных объектов и хотите удалить весь под-массив, используйте что-то вроде:

var stringsToRemove : [String] = ...
var strings : [String] = ...

strings.filter { !contains(stringsToRemove, $0) }

например:

 1> ["a", "b", "c", "d"].filter { !contains(["b", "c"], $0) }
$R5: [String] = 2 values {
  [0] = "a"
  [1] = "d"
}

Нет ли простого способа удалить конкретный элемент из массива, если он равен заданной строке? Обходные пути - найти индекс элемента массива, который вы хотите удалить, и затем removeAtIndex , или создать новый массив, в который вы добавляете все элементы, которые не равны данной строке. Но нет ли более быстрого пути?


Использование фильтра, как предложено выше, хорошо. Но если вы хотите удалить только одно вхождение значения или вы предполагаете, что в массиве нет дубликатов, и вам нужен более быстрый алгоритм, используйте это (в Swift3):

if let index = array.index(of: "stringToRemove") {
    array.remove(at: index)
} else {
    // not found
}

если вам нужно удалить subArray из массива, то это идеальное решение с использованием Swift3 :

var array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]            
let subArrayToDelete = ["c", "d", "e", "ee"]
array = array.filter{ !subArrayToDelete.contains($0) }
print(array) // ["a", "b", "f", "g", "h", "i", "j"]

это лучше для вашей производительности, чем удаление по одному.

Кстати, еще более быстрое решение (но оно переставит элементы в конечном массиве):

array = Array(Set(array).subtracting(subArrayToDelete))

Вы можете использовать filter () в сочетании с перегрузкой операторов для получения легко повторяемого решения :

func -= (inout left: [String], right: String){
    left = left.filter{$0 != right}    
}

var myArrayOfStrings:[String] = ["Hello","Playground","World"]

myArrayOfStrings -= "Hello"

print(myArrayOfStrings)   // "[Playground, World]"




elements