Le funzioni operatore in Swift sono la possibilità di implementare o ridefinire operatori standard (+, -, *, ==, <, ecc.), oltre a creare operatori personalizzati (ad esempio, %% o <|>). Per fare ciò si utilizza la parola chiave operator nella dichiarazione della funzione. Di solito, si sovraccaricano gli operatori per lavorare con i propri tipi, al fine di rendere il loro utilizzo sintatticamente conveniente e intuitivo.
Esempio di sovraccarico dell'addizione per la struttura Vector2D:
struct Vector2D { var x: Double var y: Double } func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } let v1 = Vector2D(x: 1, y: 2) let v2 = Vector2D(x: 3, y: 4) let sum = v1 + v2 // Vector2D(x: 4, y: 6)
Limitazioni:
+*-/&|^%~!=<>.?).È possibile sovraccaricare un operatore per i tipi standard, ad esempio, per cambiare il significato del + per Int?
Risposta: No, in Swift non è possibile ridefinire il comportamento globale degli operatori per i tipi standard, è possibile solo estenderlo per i propri tipi o combinazioni specifiche. Ad esempio:
// Errore: il sovraccarico per Int non cambierà la semantica esistente+ func + (lhs: Int, rhs: Int) -> Int { return lhs - rhs // Non funzionerà: conflitto con il comportamento esistente }
Storia
In un progetto è stato creato un operatore ** (potenza), che per distrazione includeva una priorità errata, causando il calcolo errato di espressioni come 2 + 3 ** 2. Risultato: risultati errati, bug difficile da debuggare.
Storia
In un modulo con API interne è stato sovraccaricato == per un tipo proprio, ma non è stata implementata l'hashing (Hashable), portando a un funzionamento scorretto delle collezioni Set e Dictionary, dove le istanze venivano considerate diverse in presenza di uguaglianza logica.
Storia
Durante la creazione di un operatore personalizzato, gli utenti hanno dimenticato di documentarne il significato. Un nuovo sviluppatore ha frainteso la semantica dell'operatore e lo ha applicato a dati inappropriati, causando errori logici difficili da individuare nella logica di business.