Swift Language Operatori personalizzati


Esempio

Swift supporta la creazione di operatori personalizzati. I nuovi operatori sono dichiarati a livello globale usando la parola chiave operator .

La struttura dell'operatore è definita da tre parti: operando posizionamento, precedenza e associatività.

  1. I modificatori prefix , infix e postfix sono utilizzati per avviare una dichiarazione personalizzata dell'operatore. I modificatori prefix e postfix dichiarano se l'operatore deve essere prima o dopo, rispettivamente, il valore su cui agisce. Tali operatori sono urnari, come 8 e 3++ ** , poiché possono agire solo su un obiettivo. L' infix dichiara un operatore binario che agisce sui due valori in cui è compreso, come 2+3 .

  2. Gli operatori con precedenza più alta vengono calcolati per primi. La precedenza dell'operatore predefinito è appena superiore a ? ... : (un valore di 100 in Swift 2.x). La precedenza degli operatori Swift standard può essere trovata qui .

  3. Associatività definisce l'ordine delle operazioni tra operatori della stessa priorità. Gli operatori associativi di sinistra sono calcolati da sinistra a destra (ordine di lettura, come la maggior parte degli operatori), mentre gli operatori associativi di destra calcolano da destra a sinistra.

3.0

A partire da Swift 3.0, si definiscono la precedenza e l'associatività in un gruppo di precedenza anziché l'operatore stesso, in modo che più operatori possano condividere facilmente la stessa precedenza senza fare riferimento ai numeri criptici. L'elenco dei gruppi di precedenza standard è mostrato di seguito .

Gli operatori restituiscono valori basati sul codice di calcolo. Questo codice agisce come una funzione normale, con parametri che specificano il tipo di input e la parola chiave return specifica il valore calcolato restituito dall'operatore.

Ecco la definizione di un semplice operatore esponenziale, poiché lo standard Swift non ha un operatore esponenziale.

import Foundation    

infix operator ** { associativity left precedence 170 }

func ** (num: Double, power: Double) -> Double{
    return pow(num, power)
}

L' infix dice che l'operatore ** lavora tra due valori, come 9**2 . Poiché la funzione ha lasciato l'associatività, 3**3**2 viene calcolata come (3**3)**2 . La precedenza di 170 è superiore a tutte le operazioni Swift standard, il che significa che 3+2**4 calcola a 19 , nonostante l'associatività a sinistra di ** .

3.0
import Foundation 

infix operator **: BitwiseShiftPrecedence

func ** (num: Double, power: Double) -> Double {
    return pow(num, power)
}

Invece di specificare esplicitamente la precedenza e l'associatività, su Swift 3.0 potremmo usare il gruppo di precedenza predefinito BitwiseShiftPrecedence che fornisce i valori corretti (come << , >> ).

**: l'incremento e il decremento sono deprecati e verranno rimossi in Swift 3.