Я создал бесконечный цикл, согласовав структуру Swift с протоколом Strideable. Я свел проблему к следующему случаю.
struct T: Strideable {
func advanced(by n: Int) -> T { return T() }
func distance(to other: T) -> Int {
print("Hello")
return self == T() ? 0 : 1
}
}
print(T() == T())
Запуск этого кода на игровой площадке приводит к бесконечному потоку сообщений "Hello". Если struct T: Strideable
заменить на struct T: Equatable
, «true» печатает, как я и ожидал.
Я подозреваю, что по умолчанию существует реализация Equatable для типов, соответствующих Strideable, которая отличается от автоматически синтезированной реализации для структур, все члены которых равны. Структура в моем проекте имеет много членов, поэтому я не хотел бы вручную осуществлять сравнение по элементам.
Почему соответствие Strideable изменяет способ реализации равенства и есть ли способ восстановить ожидаемое поведение без ручной реализации Equatable?