2016-04-07 7 views
0

Ich bin frustriert darüber, wie Swift mit der Gleichheit umgeht. Oder ich vermisse gerade etwas. Wie kommt es, dass diese 2 indexOf funktioniert nicht auf die gleiche Weise?Swift indexOf, == Operatorüberschreibung wird nicht aufgerufen

let first = self.objects.indexOf(object) //This returns nil 
let second = self.objects.indexOf{$0 == object} //This returns the index 

Meine == Überschreibung:

func ==(lhs: MyObject, rhs: MyObject) -> Bool { 
    return lhs.someProperty == rhs.someProperty 
} 

Die == Überschreibung nicht in der ersten indexOf aufgerufen. Warum ist das so? Das fühlt sich sehr gefährlich an.

(MyObject ist eine Unterklasse von PFObject (Parse.com Objekte). Ich weiß nicht, ob dies ist, was diese nach oben ist in Unordnung.)

+0

Ist 'self.object' ein' [MyObject] 'oder etwas anderes (wie ein' [ParentOfMyObject] ') – zneak

Antwort

2

Da Ihr Object ist Unterklasse von PFObject und PFObject ist Unterklasse von NSObject und NSObject bereits bestätigen die isEqual Methode Equatable unter Verwendung umzusetzen. Also funktioniert Ihre == Operatorüberschreibung nicht. Sie sollten die -Methode überschreiben. (Um ehrlich zu sein, es ist schrecklich :(

Beispielcode:

class Object: NSObject { 
    var value: Int 
    init(value: Int) { 
     self.value = value 
    } 

    override func isEqual(object: AnyObject?) -> Bool { 
     guard let obj = object as? Object else { return false } 
     return self.value == obj.value 
    } 
} 

// If your class is not inherit from any ObjC class: 
//extension Object: Equatable {} 
//func ==(lhs: Object, rhs: Object) -> Bool { 
// return lhs.value == rhs.value 
//} 

let c = Object(value: 3) 
let objs = [Object(value: 1), Object(value: 2), Object(value: 3)] 

let index = objs.indexOf(c) 
let index2 = objs.indexOf { $0 == c } 
print(index) // Optional(2) 
print(index2) // Optional(2) 
+0

DANKE. SIE. SIR! – ullstrm

0

Die zweite indexOf Methode, die Sie verwenden Sie einen Verschluss definieren erlaubt um die Objektgleichheit anzuzeigen (wie Sie es bereits getan haben). Die erste nach der Dokumentation:

Gibt den ersten Index, in den value in self oder nil erscheint, wenn der Wert nicht gefunden wird.

Dabei ist value das Objekt, das Sie als Parameter übergeben. Ohne die Implementierung dieser Version zu sehen, kann ich nur davon ausgehen, dass sie vergleichen, wenn die beiden Objekte in jeder Hinsicht gleich sind (alle Eigenschaften stimmen überein). Wenn Sie also in Ihrem Fall nur die Objekte als gleich betrachten, wenn die someProperty s übereinstimmen, dann sollten Sie die Methode closure mit Ihrem überladenen Operator verwenden.

+0

So wir? weiß nicht, was indexOf als Vergleich verwendet ?:( – ullstrm

+0

Well Swift ist Open Source jetzt, ich bin mir sicher, dass Sie es finden könnten, wenn Sie wirklich wollten. – Slayter