wake-up-neo.net

Entfernen von Objekten aus dem Array in Swift 3

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'
52

Das Swift (3) -Äquivalent zu NSMutableArrays 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"}
100
vadian
var a = ["one", "two", "three", "four", "five"]

// Remove/filter item with value 'three'
a = a.filter { $0 != "three" }
61
nyxee

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)
}
22
Mark Semsel

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) 
13
Luca Davanzo
  1. for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) ist für eine Schleife im C-Stil und wurde entfernt

  2. Ä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)
    }
    
5
Tj3n

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")
4
Mohsenasm

Swift 4

var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]

if let index = students.firstIndex(where: { $0.hasPrefix("A") }) {
   students.remove(at: index)
}
4
Sergey Di

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)
}
2
Joerg

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 

1
Dili

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

0
yoAlex5

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
    }
}
0
Renetik

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

0
Mahesh Cheliya