Переопределенная функция == для типа Equatable, не вызываемого для пользовательского класса, который подклассов NSCoding и NSObject

FooBar класс ниже должен переопределить == функция Equatable тип.

Тем не менее, призывая contains на массиве FooBar объекты не вызывают точку останова внутри кастома == функция для вызова. Возможно ли другое == функция переопределяет эту пользовательскую?

Примечание. Поскольку FooBar должен создавать подклассы из NSCoding и NSObject, FooBar не перечисляет Equatable как протокол, потому что он вызывает эту ошибку:

Резервное соответствие 'FooBar' протоколу 'Equatable'

func ==(lhs: FooBar, rhs: FooBar) -> Bool {
    return lhs.id == rhs.id
}

class FooBar: NSObject, NSCoding {
     // Class def
}

// Both serverFooBars and gFooBars are [FooBar]
let newFooBars = serverFooBars.filter { !gFooBars.contains($0) }

2 ответа

Решение

Потому что ваш класс наследует от NSObject вам не нужно использовать протокол Swift Equatable вместо этого вы должны переопределить NSObject метод isEquals:

Swift 3.x

class FooBar: NSObject, NSCoding {
  override func isEqual(_ object: Any?) -> Bool {
    return id == (object as? FooBar)?.id
  }
}

(Спасибо Камчатке)

Swift 2.x

class FooBar: NSObject, NSCoding {
  override func isEqual(object: AnyObject?) -> Bool {
    return id == (object as? FooBar)?.id
  }
}

Вы получаете эту ошибку, потому что NSObject уже соответствует Equatable через его метод isEqual.

Так что я не уверен, что это правильный способ сделать это, но вы можете переопределить метод isEqual для NSObject:

class FooBar: NSObject, NSCoding {
...

override func isEqual(object: AnyObject?) -> Bool {
    return self == (object as? FooBar)
}
Другие вопросы по тегам