La sobrecarga de operadores es la capacidad de definir o redefinir el comportamiento de operadores estándar (y personalizados) para tipos de usuario. Esto permite que las operaciones con sus estructuras y clases sean más expresivas.
Características:
static func y el modificador obligatorio operator en el scope global.Equatable, Comparable, etc.).infix, prefix, postfix), especificándolos con las palabras clave correspondientes.Ejemplo:
struct Vector2D { var x: Double var y: Double static func +(lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } } let a = Vector2D(x: 1, y: 2) let b = Vector2D(x: 3, y: 4) let sum = a + b // Vector2D(x: 4, y: 6)
Matices:
ExpressibleByBooleanLiteral, BooleanType).precedence group).¿Se pueden sobrecargar operadores estándar como + para trabajar con objetos de clases y qué se necesita para implementar la comparación de sus propias estructuras a través de ==?
Respuesta: Sí, los operadores estándar (por ejemplo, +, ==, <) se pueden sobrecargar para estructuras y clases personalizadas. Para comparar estructuras/clases a través de ==, el tipo debe conformarse al protocolo Equatable y implementar la función estática de igualdad:
Ejemplo:
struct Point: Equatable { let x: Int let y: Int static func ==(lhs: Point, rhs: Point) -> Bool { return lhs.x == rhs.x && lhs.y == rhs.y } }
Historia
Se sobrecargó el operador == para una estructura, pero no se implementó hash(into:), al mismo tiempo que se usó este tipo como clave en un Set o en un diccionario. Como resultado, los elementos idénticos se agregaron al conjunto dos veces o no se encontraron, ya que el mecanismo estándar de Hashable fue violado.
Historia
Se creó un operador infix personalizado sin especificar el precedence group. El operador funcionaba inesperadamente con reglas de asociatividad ilógicas, causando errores en expresiones complejas.
Historia
En el proyecto se introdujo el operador | para fusionar modelos, sin embargo, los novatos a menudo lo confundían con la operación de bits OR, lo que causaba confusión y un manejo incorrecto de los datos en la verificación ligera de banderas booleanas.