Почему соответствие Strideable меняет способ оценки умножения? - PullRequest
0 голосов
/ 20 марта 2019

Я создал бесконечный цикл, согласовав структуру 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?

1 Ответ

1 голос
/ 20 марта 2019

Это из документов Apple:

Важно Протокол Strideable предоставляет реализации по умолчанию для операторов равных (==) и меньше (<), которые зависят от типа Strideреализации.Если тип, соответствующий Strideable, является его собственным типом Stride, он должен предоставлять конкретные реализации двух операторов, чтобы избежать бесконечной рекурсии. </p>

Так что вы либо предоставляете реализацию "==" и "<" следующим образом: </p>

 struct Temp: Strideable {
var error = 1
func advanced(by n: Int) -> Temp { return Temp() }
func distance(to other: Temp)  -> Int {
    print("hello")
    return self == other ? 0 : 1
}
static func == (left : T, right: T){
    print("great")
}
}

или используйте какое-либо значение для управления свойством шага.как var location : Int = 0

...