2016-04-07 4 views
0

Я расстраиваюсь тем, как Swift обрабатывает равенство. Или я просто что-то пропустил. Почему эти 2 indexOf НЕ работают одинаково?Swift indexOf, == оператор override не получает вызов

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

Мой == переопределение:

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

== переопределение не дозвонились в первом IndexOf. Почему это так? Это действительно опасно.

(MyObject подкласс PFObject (Parse.com объектов). Я не знаю, если это то, что Мессинг это.)

+0

Является '' self.object' [MyObject] 'или что-то другое (например,' [ParentOfMyObject] ') – zneak

ответ

2

Поскольку ваш Object является подклассом PFObject и PFObject является подклассом NSObject и NSObject уже подтвердить Equatable с помощью метода isEqual реализовать. Таким образом, переопределение вашего оператора == не работает. Вы должны переопределить метод isEqual. (Честно говоря, это ужасно :(

Пример кода:

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

СПАСИБО. – ullstrm

0

Второй indexOf метод, который вы используете позволяет определить замыкание для обозначения равенства объектов (как вы уже сделали). Первый один в соответствии с документацией:

Возвращает первый индекс, где value появляется в self или nil, если значение не найдено.

Адрес value - объект, который вы передаете в качестве параметра. Не видя реализации этой версии, я могу предположить, что они сравниваются, если оба объекта одинаковы во всех отношениях (все свойства соответствуют). Поэтому в вашем случае, если вы считаете только объекты равными, если соответствует somePropertys, то вы должны использовать метод закрытия с вашим перегруженным оператором.

+0

Так мы? не знаю, что использует indexOf для сравнения? :( – ullstrm

+0

Well Swift - это с открытым исходным кодом, поэтому я уверен, что вы можете найти его, если хотите. – Slayter

Смежные вопросы