Перегрузка оператора еще не поддерживается?

Согласно Руководству по быстрому программированию, перегрузка оператора разрешена и фактически довольно универсальна. Однако мне не удалось заставить его работать на игровой площадке.

Например, протокол Equatable требует этого: func ==(lhs:Self, rhs:Self) -> Bool

Скажем, я делаю простую конструкцию Location3D:

struct Location3D
{
    var x : Double
    var y : Double
    var z : Double
}

Теперь я хочу, чтобы этот Location3D реализовал протокол Equatable, поэтому я добавляю его вместе с этим методом:

func ==(lhs: Self, rhs: Self) -> Bool
{
    return lhs.x == rhs.x &&
           lhs.y == rhs.y &&
           lhs.z == rhs.z
}

Я получаю ошибку компилятора операторов разрешены только в глобальной области. А?

Итак, я попробовал добавить функцию @infix к функции, переместив функцию на расширение, вместо этого изменив тип на класс... все безрезультатно.

Я что-то упустил? Как вы должны реализовать Equtable и Comparable, когда операторы не работают?

Ответы

Ответ 1

Вам нужно переопределить оператор == в глобальной области действия, но с вашим типом для аргументов.

В этом случае это означает, что вы заявляете, что ваша структура соответствует протоколу, а затем просто реализует функцию вне ее.

struct Location3D : Equatable {
    // ...
}

func ==(lhs: Location3D, rhs: Location3D) -> Bool {
    // ...
}

См. ссылку на библиотеку для дальнейшего обсуждения:

https://developer.apple.com/documentation/swift/equatable