Перегрузка оператора еще не поддерживается?
Согласно Руководству по быстрому программированию, перегрузка оператора разрешена и фактически довольно универсальна. Однако мне не удалось заставить его работать на игровой площадке.
Например, протокол 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