532 Stimmen

Wie finde ich den Index des Listenelements in Swift?

Ich versuche, einen Elementindex zu finden, indem ich eine Liste durchsuche. Weiß jemand, wie das geht?

Ich sehe, dass es Liste.StartIndex und Liste.EndIndex gibt, aber ich möchte etwas ähnliches wie list.index("text") in Python.

10voto

Gurjinder Singh Punkte 7152

Swift 4. Wenn Ihr Array Elemente des Typs [String: AnyObject] enthält. Verwenden Sie also den folgenden Code, um den Index des Elements zu finden

var array = [[String: AnyObject]]()// Speichern Sie Ihre Daten im Array
let objectAtZero = array[0] // das erste Objekt erhalten
let index = (self.array as NSArray).index(of: objectAtZero)

Oder Wenn Sie den Index auf der Grundlage des Schlüssels aus dem Dictionary finden möchten. Hier enthält das Array Objekte der Modellklasse und ich gleiche die id-Eigenschaft ab.

   let userId = 20
    if let index = array.index(where: { (dict) -> Bool in
           return dict.id == userId // Wird den Index der übereinstimmenden id finden
    }) {
    print("Index gefunden")
    }
ODER
      let storeId = Int(surveyCurrent.store_id) // Zugriff auf Modellschlüsselwert
      indexArrUpTo = self.arrEarnUpTo.index { Int($0.store_id) == storeId }! // Array enthält Modelle und findet spezifisches

7voto

mzaink Punkte 261

Für (>= swift 4.0)

Es ist ziemlich einfach. Betrachte das folgende Array Objekt.

var names: [String] = ["jack", "rose", "jill"]

Um den Index des Elements rose zu erhalten, musst du einfach folgendes tun:

names.index(of: "rose") // gibt 1 zurück

Hinweis:

  • Array.index(of:) gibt ein Optional zurück.

  • nil bedeutet, dass das Element nicht im Array vorhanden ist.

  • Eventuell möchtest du den zurückgegebenen Wert erzwingen oder ein if-let verwenden, um mit dem Optional umzugehen.

6voto

Naishta Punkte 10822

In Swift 4, wenn Sie durch Ihr DataModel-Array traversieren, stellen Sie sicher, dass Ihr Datenmodell dem Equatable-Protokoll entspricht, implementieren Sie die Methode lhs=rhs und verwenden Sie dann erst ".index(of" . Zum Beispiel

class Photo : Equatable{
    var imageURL: URL?
    init(imageURL: URL){
        self.imageURL = imageURL
    }

    static func == (lhs: Photo, rhs: Photo) -> Bool{
        return lhs.imageURL == rhs.imageURL
    }
}

Und dann,

let index = self.photos.index(of: aPhoto)

5voto

rickster Punkte 121640

In Swift 2 (mit Xcode 7) enthält Array eine indexOf-Methode, die vom CollectionType-Protokoll bereitgestellt wird. (Tatsächlich gibt es zwei indexOf-Methoden - eine, die Gleichheit verwendet, um ein Argument zu finden, und eine andere, die einen Closure verwendet.)

Vor Swift 2 gab es keine Möglichkeit für generische Typen wie Sammlungen Methoden für die konkreten Typen abzuleiten, die von ihnen abstammen (wie Arrays). Also war in Swift 1.x "index of" eine globale Funktion... Und sie wurde auch umbenannt, also heißt diese globale Funktion in Swift 1.x find.

Es ist auch möglich (aber nicht notwendig), die Methode indexOfObject von NSArray zu verwenden... oder eine der anderen, anspruchsvolleren Suchmethoden aus Foundation, die keine Entsprechungen in der Swift-Standardbibliothek haben. Einfach import Foundation (oder ein anderes Modul, das transitsiv Foundation importiert), Ihr Array in NSArray umwandeln und Sie können die vielen Suchmethoden auf NSArray verwenden.

5voto

Kevin ABRIOUX Punkte 14633

Keine dieser Lösungen funktioniert für mich

Dies ist die Lösung, die ich für Swift 4 habe:

let montag = Day(name: "M")
let dienstag = Day(name: "D")
let freitag = Day(name: "F")

let tage = [montag, dienstag, freitag]

let index = tage.index(where: { 
            //wichtig, mit === zu testen, um sicherzustellen, dass es die gleiche Objektreferenz ist
            $0 === dienstag
        })

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