570 Stimmen

Wie man überprüft, ob ein Element in einem Array vorhanden ist

In Swift, wie kann ich überprüfen, ob ein Element in einem Array vorhanden ist? Xcode hat keine Vorschläge für contain, include oder has, und eine schnelle Suche im Buch ergab nichts. Irgendeine Idee, wie man das überprüfen kann? Ich weiß, dass es eine Methode find gibt, die die Indexnummer zurückgibt, aber gibt es eine Methode, die wie Rubys #include? ein boolesches Ergebnis zurückgibt?

Beispiel, was ich brauche:

var elements = [1,2,3,4,5]
if elements.contains(5) {
  //etwas tun
}

995voto

Martin R Punkte 510450

Swift 2, 3, 4, 5:

let elements = [1, 2, 3, 4, 5]
if elements.contains(5) {
    print("yes")
}

contains() ist eine Protokollerweiterungsmethode von SequenceType (für Sequenzen von Equatable-Elementen) und nicht eine globale Methode wie in früheren Versionen.

Bemerkungen:

Ältere Swift-Versionen:

let elements = [1,2,3,4,5]
if contains(elements, 5) {
    println("yes")
}

155voto

DogCoffee Punkte 19387

Für diejenigen, die hierher gekommen sind, um ein Objekt aus einem Array zu finden und zu entfernen:

Swift 1

if let index = find(itemList, item) {
    itemList.removeAtIndex(index)
}

Swift 2

if let index = itemList.indexOf(item) {
    itemList.removeAtIndex(index)
}

Swift 3, 4

if let index = itemList.index(of: item) {
    itemList.remove(at: index)
}

Swift 5.2

if let index = itemList.firstIndex(of: item) {
    itemList.remove(at: index)
}

70voto

David Berry Punkte 40327

Aktualisiert für Swift 2+

Beachten Sie, dass ab Swift 3 (oder sogar 2) die unten stehende Erweiterung nicht mehr notwendig ist, da die globale contains-Funktion in eine Paar Erweiterungsmethoden auf Array umgewandelt wurde, die es Ihnen ermöglichen:

let a = [ 1, 2, 3, 4 ]

a.contains(2)           // => true, nur verwendbar, wenn Element: Equatable

a.contains { $0 < 1 }   // => false

Historische Antwort für Swift 1:

Verwenden Sie diese Erweiterung: (aktualisiert auf Swift 5.2)

 extension Array {
     func contains(obj: T) -> Bool where T: Equatable {
         return !self.filter({$0 as? T == obj}).isEmpty
     }
 }

Verwendung als:

array.contains(1)

47voto

Andrew Schreiber Punkte 13284

Wenn Sie überprüfen, ob eine Instanz einer benutzerdefinierten Klasse oder Struktur in einem Array enthalten ist, müssen Sie das Equatable-Protokoll implementieren, bevor Sie .contains(myObject) verwenden können.

Zum Beispiel:

struct Cup: Equatable {
    let filled:Bool
}

static func ==(lhs:Cup, rhs:Cup) -> Bool { // Implement Equatable
    return lhs.filled == rhs.filled
}

dann können Sie folgendes tun:

cupArray.contains(myCup)

Tipp: Die == -Überschreibung sollte auf globaler Ebene erfolgen, nicht innerhalb Ihrer Klasse/Struktur

32voto

Jeffery Thomas Punkte 41299

Ich habe den Filter benutzt.

let results = elements.filter { el in el == 5 }
if results.count > 0 {
    // alle übereinstimmenden Elemente sind in den Ergebnissen
} else {
    // nicht gefunden
}

Wenn du magst, kannst du das komprimieren zu

if elements.filter({ el in el == 5 }).count > 0 {
}

Hoffentlich hilft das.


Aktualisierung für Swift 2

Juchhu für Standardimplementierungen!

if elements.contains(5) {
    // alle übereinstimmenden Elemente sind in den Ergebnissen
} else {
    // nicht gefunden
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X