2016-04-15 14 views
2

Was ist der effizienteste Weg, um den Index eines Artikels im Array zu erhalten? In Objective-C waren wir in der Lage zu tun:Wie erhält man den Index eines Artikels in einem Array?

[arrayName indexOfObject:myObject] 

in Swift, ich weiß, wir können Folgendes tun.

index =arrayName.indexOf({$0 === myObject}) 

ist dies der sauberste und effizienteste Weg, dies zu tun?

+1

wie es aussieht, wird diese Frage in erster Linie Meinung basiert. Bitte erläutern Sie, was Sie mit "sauber und effizient" meinen. – JAL

Antwort

11

Wie Oliver wies darauf hin, Sie können

let index = array.indexOf(myObject) 

verwenden, dies wird jedoch nur arbeiten, wenn Ihr Objekt dem Equatable Protokoll entspricht, um es zu entsprechen, müssen Sie die == Funktion implementieren, wie folgt aus:

class MyClass { 
} 

extension MyClass: Equatable { } 

func ==(lhs: MyClass, rhs: MyClass) -> Bool { 
    return lhs === rhs // === returns true when both references point to the same object 
} 

Wenn Ihre Klasse erbt von NSObject und Ihr Vergleich ist etwas anderes als nur den Vergleich Zeiger, auch Sie außer Kraft setzen isEqual: müssen

override func isEqual(object: AnyObject?) -> Bool { 
    guard let obj = object as? MyClass else { return false } 
    return self == obj 
} 
+0

Es gibt keine Notwendigkeit, IsEqual zu überschreiben, jedes NSObject hat seine eigene Basisimplementierung, die auf Zeigergleichheit prüft, sollten Sie nur, wenn Sie etwas anders als der Wert der Zeiger übereinstimmen müssen – Andrea

+0

@Andrea Sie haben Recht, ich aktualisiert meine Antwort, um das zu reflektieren. – EmilioPelaez

3

können Sie verwenden:

let index = array.indexOf(myObject) 

Sie brauchen nicht den Verschluss zu verwenden, wie indexOf das Element selbst als Argument akzeptiert

Beachten Sie, dass Index optional ist aber

+0

und dass myObject Equatable entsprechen muss und dass es den Index der ersten Übereinstimmung – Andrea

+0

Yes genau zurückgeben wird, obwohl die Schließung ronaldoh1 dies auch erfordert. –

+0

Ich glaube nicht ... Ronaldo verwendet === der Identity-Operator, der nur für den Referenztyp gültig ist und prüft, ob die Objekte die gleichen Referenzen haben. – Andrea

Verwandte Themen