In meiner Anwendung habe ich tableview verwendet. Ich habe ein Objekt im Array hinzugefügt, wenn Sie eine Zelle auswählen, und das Objekt abwählen und entfernen, wenn Sie die Zelle erneut auswählen. Ich habe diesen Code verwendet, aber gib mir einen Fehler. Bitte hilf mir
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
let cell = tableView.cellForRow(at: indexPath as IndexPath) as? ConctactsCell
cell?.imgCheckMark.image = UIImage(named:"check_mark")
arrContacts.append(contacts[indexPath.row] )
NSLog("selected code = %@",arrContacts);
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath as IndexPath) as? ConctactsCell
cell?.imgCheckMark.image = UIImage(named:"")
arrContacts.removeObject(contacts[indexPath.row])
}
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)
}
}
}
Es gibt mir 3 Fehler so
Declaration is only valid at file scope
C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'
Das Swift (3) -Äquivalent zu NSMutableArray
s removeObject
lautet:
var array = ["alpha", "beta", "gamma"]
if let index = array.index(of:"beta") {
array.remove(at: index)
}
wenn die Objekte eindeutig sind. Es ist überhaupt nicht nötig, in NSArray
umzuwandeln und indexOfObject:
zu verwenden.
Wenn dasselbe Objekt mehrfach vorkommt, verwenden Sie filter
. In Fällen wie Datenquellenarrays, in denen ein Index einem bestimmten Objekt zugeordnet ist, ist index(of
vorzuziehen, da er schneller als filter
ist.
Update:
In Swift 4.2 und mehr können Sie ein oder mehrere Vorkommen von beta
mit removeAll
entfernen:
array.removeAll{$0 == "beta"}
var a = ["one", "two", "three", "four", "five"]
// Remove/filter item with value 'three'
a = a.filter { $0 != "three" }
Für Swift 3 können Sie index (wo :) verwenden und eine Schließung einschließen, die den Vergleich eines Objekts im Array ($ 0) mit dem gewünschten Objekt ausführt.
var array = ["alpha", "beta", "gamma"]
if let index = array.index(where: {$0 == "beta"}) {
array.remove(at: index)
}
Eine weitere schöne und nützliche Lösung besteht darin, diese Art von Erweiterung zu erstellen:
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
}
}
Auf diese Weise, wenn Sie über ein Array mit benutzerdefinierten Objekten verfügen:
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)
for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object)
ist für eine Schleife im C-Stil und wurde entfernt
Ändern Sie Ihren Code in etwas Ähnliches, um alle ähnlichen Objekte zu entfernen, wenn sie eine Schleife haben:
let indexes = arrContacts.enumerated().filter { $0.element == contacts[indexPath.row] }.map{ $0.offset }
for index in indexes.reversed() {
arrContacts.remove(at: index)
}
Verwenden Sie in Swift 3 diese Extension
:
extension Array where Element: Equatable{
mutating func remove (element: Element) {
if let i = self.index(of: element) {
self.remove(at: i)
}
}
}
beispiel:
var array = ["alpha", "beta", "gamma"]
array.remove(element: "beta")
Swift 4
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
if let index = students.firstIndex(where: { $0.hasPrefix("A") }) {
students.remove(at: index)
}
Die korrekte und funktionierende einzeilige Lösung zum Löschen eines eindeutigen Objekts (mit dem Namen "objectToRemove") aus einem Array dieser Objekte (mit dem Namen "Array") in Swift 3 lautet:
if let index = array.enumerated().filter( { $0.element === objectToRemove }).map({ $0.offset }).first {
array.remove(at: index)
}
Versuchen Sie dies in Swift 3
array.remove(at: Index)
Anstatt
array.removeAtIndex(index)
Update
"Declaration is only valid at file scope".
Stellen Sie sicher, dass sich das Objekt im Gültigkeitsbereich befindet. Sie können den Gültigkeitsbereich "intern" angeben. Dies ist der Standard.
index(of:<Object>)
funktioniert, Klasse sollte Equatable
entsprechen
In Swift 3 und 4
var array = ["a", "b", "c", "d", "e", "f"]
for (index, element) in array.enumerated().reversed() {
array.remove(at: index)
}
Ab Swift 4.2 können Sie einen fortgeschritteneren Ansatz verwenden (schneller und speichereffizienter).
array.removeAll(where: { $0 == "c" })
anstatt
array = array.filter { !$0.hasPrefix("c") }
Lesen Sie mehr hier
Erweiterung für Array, um es einfach zu machen und Verketten zu ermöglichen:
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
}
}
Dies ist die offizielle Antwort, um den Index eines bestimmten Objekts zu finden. Dann können Sie jedes Objekt mit diesem Index leicht entfernen:
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"]
Hier ist der Link: https://developer.Apple.com/documentation/Swift/array/2994720-firstindex