В моем приложении я добавил один объект в массив при выборе ячейки и отменил выбор и удалил объект при повторном выборе ячейки. Я использовал этот код, но дал мне ошибку.
extension Array {
func indexOfObject(object : AnyObject) -> NSInteger {
return (self as NSArray).indexOfObject(object)
}
mutating func removeObject(object : AnyObject) {
for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) {
self.removeAtIndex(index)
}
}
}
class MyViewController: UITableViewController {
var arrContacts: [Any] = []
var contacts: [Any] = []
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
arrContacts.removeObject(contacts[indexPath.row])
}
}
Это дает мне 2 такие ошибки:
C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'
Set<Contact>
а не массив. Не могли бы вы предоставить дополнительную информацию о вашем контактном объекте? Если вы сделали это сами, вам нужно, чтобы он соответствовалHashable
иEquatable
для того, чтобы поместить его в наборОтветы:
Swift, эквивалентный
NSMutableArray
sremoveObject
:var array = ["alpha", "beta", "gamma"] if let index = array.firstIndex(of: "beta") { array.remove(at: index) }
если объекты уникальны . Совершенно не нужно преобразовывать
NSArray
и использоватьindexOfObject:
API
index(of:
также работает, но это вызывает ненужное неявное преобразование моста вNSArray
.Если есть несколько экземпляров одного и того же объекта, используйте
filter
. Однако в таких случаях, как массивы источников данных, где индекс связан с конкретным объектомfirstIndex(of
, предпочтительнее, потому что он быстрее, чемfilter
.Обновить:
В Swift 4.2+ вы можете удалить одно или несколько вхождений
beta
с помощьюremoveAll(where:)
:array.removeAll{$0 == "beta"}
источник
.index(of:
доступен только в том случае, если коллекция содержитEquatable
типы.while let index = array.index(of: "beta") { array.remove(at: index) }
filter
решение. Но если объекты уникальны, используйте всегда,index(of
потому что они намного производительнее, чемfilter
var a = ["one", "two", "three", "four", "five"] // Remove/filter item with value 'three' a = a.filter { $0 != "three" }
источник
Для Swift 3 вы можете использовать index (where :) и включить закрытие, которое сравнивает объект в массиве ($ 0) с тем, что вы ищете.
var array = ["alpha", "beta", "gamma"] if let index = array.index(where: {$0 == "beta"}) { array.remove(at: index) }
источник
Еще одно приятное и полезное решение - создать такое расширение:
extension Array where Element: Equatable { @discardableResult mutating func remove(object: Element) -> Bool { if let index = index(of: object) { self.remove(at: index) return true } return false } @discardableResult mutating func remove(where predicate: (Array.Iterator.Element) -> Bool) -> Bool { if let index = self.index(where: { (element) -> Bool in return predicate(element) }) { self.remove(at: index) return true } return false } }
Таким образом, если у вас есть массив с настраиваемыми объектами:
let obj1 = MyObject(id: 1) let obj2 = MyObject(id: 2) var array: [MyObject] = [obj1, obj2] array.remove(where: { (obj) -> Bool in return obj.id == 1 }) // OR array.remove(object: obj2)
источник
remove(element: Element)
потому что в Array вы можете хранить также такие типы, как Int, Double - они не являются объектами.В Swift 5 используйте это
Extension
:extension Array where Element: Equatable{ mutating func remove (element: Element) { if let i = self.firstIndex(of: element) { self.remove(at: i) } } }
пример:
var array = ["alpha", "beta", "gamma"] array.remove(element: "beta")
В Swift 3 используйте это
Extension
:extension Array where Element: Equatable{ mutating func remove (element: Element) { if let i = self.index(of: element) { self.remove(at: i) } } }
пример:
var array = ["alpha", "beta", "gamma"] array.remove(element: "beta")
источник
for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object)
предназначен для цикла в стиле C и был удаленИзмените свой код на что-то вроде этого, чтобы удалить все похожие объекты, если они зациклились:
let indexes = arrContacts.enumerated().filter { $0.element == contacts[indexPath.row] }.map{ $0.offset } for index in indexes.reversed() { arrContacts.remove(at: index) }
источник
Swift 4
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"] if let index = students.firstIndex(where: { $0.hasPrefix("A") }) { students.remove(at: index) }
источник
Правильное и рабочее однострочное решение для удаления уникального объекта (с именем «objectToRemove») из массива этих объектов (с именем «array») в Swift 3:
if let index = array.enumerated().filter( { $0.element === objectToRemove }).map({ $0.offset }).first { array.remove(at: index) }
источник
Попробуйте это в Swift 3
array.remove(at: Index)
Вместо того
Обновить
"Declaration is only valid at file scope".
Убедитесь, что объект находится в области видимости. Вы можете указать "внутреннюю" область видимости, которая используется по умолчанию.
index(of:<Object>)
чтобы работать, класс должен соответствоватьEquatable
источник
В Swift 3 и 4
var array = ["a", "b", "c", "d", "e", "f"] for (index, element) in array.enumerated().reversed() { array.remove(at: index) }
В Swift 4.2 вы можете использовать более продвинутый подход (более быстрый и эффективный с точки зрения памяти)
array.removeAll(where: { $0 == "c" })
вместо того
array = array.filter { !$0.hasPrefix("c") }
Подробнее здесь
источник
Расширение для массива, чтобы сделать это легко и позволить цепочку для Swift 4.2 и выше:
public extension Array where Element: Equatable { @discardableResult public mutating func remove(_ item: Element) -> Array { if let index = firstIndex(where: { item == $0 }) { remove(at: index) } return self } @discardableResult public mutating func removeAll(_ item: Element) -> Array { removeAll(where: { item == $0 }) return self } }
источник
Это официальный ответ для поиска индекса конкретного объекта, после чего вы можете легко удалить любой объект, используя этот индекс:
var students = ["Ben", "Ivy", "Jordell", "Maxime"] if let i = students.firstIndex(of: "Maxime") { // students[i] = "Max" students.remove(at: i) } print(students) // Prints ["Ben", "Ivy", "Jordell"]
Вот ссылка: https://developer.apple.com/documentation/swift/array/2994720-firstindex
источник
Это то, что я использовал (Swift 5) ...
extension Array where Element:Equatable { @discardableResult mutating func removeFirst(_ item:Any ) -> Any? { for index in 0..<self.count { if(item as? Element == self[index]) { return self.remove(at: index) } } return nil } @discardableResult mutating func removeLast(_ item:Any ) -> Any? { var index = self.count-1 while index >= 0 { if(item as? Element == self[index]) { return self.remove(at: index) } index -= 1 } return nil } } var arrContacts:[String] = ["A","B","D","C","B","D"] var contacts: [Any] = ["B","D"] print(arrContacts) var index = 1 arrContacts.removeFirst(contacts[index]) print(arrContacts) index = 0 arrContacts.removeLast(contacts[index]) print(arrContacts)
Полученные результаты:
["A", "B", "D", "C", "B", "D"] ["A", "B", "C", "B", "D"] ["A", "B", "C", "D"]
Важно: массив, из которого вы удаляете элементы, должен содержать элементы Equatable (такие как объекты, строки, числа и т. Д.)
источник