Comment créer un opérateur personnalisé (comme ~ = opérateur) dans swift ?? -

J'ai vu des développeurs utiliser des opérateurs personnalisés qui ajoutent une signification au code et réduisent la quantité de code nécessaire pour effectuer une opération. La création d'opérateurs personnalisés n'est pas encouragée. Mais vous pouvez toujours le faire si vous le souhaitez !!

J'apprenais rapidement la correspondance des motifs et mes yeux se sont posés sur un opérateur spécial ~ =. J’avais déjà utilisé cela pour la correspondance de motifs, mais je ne savais pas comment cela fonctionnait. J'ai utilisé l'opérateur ~ = pour vérifier si l'erreur http tombe dans une plage donnée (je voulais vérifier si l'erreur est 4xx sauf 401), comme ceci:

Je n'avais aucune idée de ce que ça fait en interne. Je ne savais pas non plus que nous pouvions aussi créer des opérateurs personnalisés comme celui-ci. Alors, j'ai demandé à Google à ce sujet et il m'a montré tout ce que je voulais.

Jetez un coup d’œil à certains de ces opérateurs dans Swift: Defines Swift

Types d'opérateurs

Les opérateurs en rapide tombent dans les types suivants:

  • Infix - Utilisé entre deux valeurs (ex: + )
  • Préfixe - Utilisé avant une valeur (ex:! )
  • Postfixe - Utilisé après une valeur (ex: !)
  • Ternaire - Deux symboles insérés entre trois valeurs (ex: ? : ). Nous ne pouvons pas créer d'opérateurs ternaires personnalisés pour l'instant. Swift n’autorisera pas les développeurs à le faire.

Comment créer des opérateurs personnalisés ??

Créons un opérateur personnalisé pour trouver la racine carrée d’un nombre à l’aide du symbole √.

Note: Nous avons déjà la fonction sqrt () pour trouver la racine carrée et est facile à utiliser. Considérez ceci comme un exemple simple pour créer des opérateurs personnalisés.

Nous devrions utiliser ceci comme opérateur de préfixe comme:

let someVal = 25
let squareRoot = √someVal // le résultat est 5

Discutons des étapes pour en créer une.

  • Nous devons déclarer ce symbole √ en tant qu'opérateur de préfixe.
préfixe opérateur √
  • Nous devons créer une fonction qui accepte un paramètre et effectuer l'opération (racine carrée).
préfixe func √ (lhs: Double) -> Double {
retour sqrt (lhs)
}

TERMINÉ!! - - - Félicitations!!. Vous venez de créer un opérateur de préfixe personnalisé pour rechercher la racine carrée.

Opérateur de racine carrée personnalisé dans swift

Créons un opérateur infixe personnalisé en utilisant le symbole.

La fonction opérateur ◉ acceptera deux valeurs lhs et rhs et renverra la somme des carrés de ces valeurs. c'est à dire; si lhs est 2 et rhs est 3, le résultat sera 4 + 9. ie; 13

Si vous vous rappelez les étapes,

  • Nous devons déclarer ce symbole en tant qu'opérateur infixe.
infixe opérateur ◉
  • Nous devons créer une fonction qui accepte deux paramètres et effectuer l'opération décrite ci-dessus.
infix func ◉ (lhs: double, rhs: double) -> double {
retourne lhs * lhs + rhs * rhs
}

Si vous faites cela, le compilateur vous hurle dessus en disant: erreur: MyPlayground.playground: 14: 1: erreur: le modificateur ‘infix’ n’est pas requis ni autorisé dans les déclarations func

Donc, réécrivez la fonction en supprimant le mot clé infix.

 func ◉ (lhs: Double, rhs: Double) -> Double {
retourne lhs * lhs + rhs * rhs
}

Félicitations. Vous venez de créer un opérateur infix personnalisé. Mais attendez. Est-ce que c'est ??

Question: c'est ça? Devons-nous envisager autre chose lors de la création d'un opérateur personnalisé?

Réponse: OUI !!! .. Nous avons presque oublié la priorité des opérateurs que nous avons apprise à l’école.

Pages de référence: Ordre des opérations, Déclarations de l'opérateur.

En mathématiques et dans la plupart des langages informatiques, la multiplication a une priorité supérieure à l'addition. Ainsi, l'expression 2 + 3 × 4 est interprétée comme ayant la valeur 2 + (3 × 4) = 14, pas (2 + 3) × 4 = 20. Nous devrons en tenir compte également lors de la création d'un opérateur personnalisé. La préséance des opérateurs est un facteur important.

Préséance et associativité

Lien Apple Docs ici.

La priorité des opérateurs donne à certains opérateurs une priorité plus élevée que d’autres; ces opérateurs sont appliqués en premier.

L'associativité des opérateurs définit la manière dont les opérateurs de même priorité sont regroupés, soit à gauche, soit à droite. Pensez-y comme signifiant "ils associent à l'expression à leur gauche" ou "ils associent à l'expression à leur droite".

Les types ayant une associativité à gauche sont analysés de sorte que v1 + v2 + v3 == (v1 + v2) + v3. Le contraire est vrai pour une associativité correcte.

Si vous déclarez un nouvel opérateur sans spécifier de groupe de priorité, il fait partie du groupe de précédence DefaultPrecedence. DefaultPrecedence n'a pas d'associativité et une priorité immédiatement supérieure à TernaryPrecedence.
Source: Raywenderlich

Référez-vous à la documentation Apple pour obtenir la liste complète des opérateurs utilisés dans swift avec leurs détails.

Pour revenir à notre opérateur ◉ infix, il ne correspond à aucun des groupes de précédence standard. Nous devrons créer le nôtre. Comment faire ça?

  • Créez un groupe de priorité appelé SquareSumOperatorPrecedence.
precedencegroup SquareSumOperatorPrecedence {
lowerThan: MultiplicationPrecedence
supérieurThan: AdditionPrecedence
associativité: gauche
mission: faux
}

Ici, nous avons créé un groupe de priorité avec une priorité supérieure à AdditionPrecedence et inférieure à MultiplicationPrecedence et à une associativité de gauche.

‘None’, ‘left’ ou ‘right’ sont les valeurs possibles pour l’associativité.
Le modificateur d'affectation fonctionne comme suit: une affectation marquée par un opérateur est repliée dans une chaîne facultative, permettant à foo? .Bar + = 2 de fonctionner comme foo? (. Bar + = 2) au lieu de ne pas vérifier le type (foo?). .bar) + = 2.
Ce comportement sera transmis à affectation: true sur les groupes de priorité.
  • Remplacez maintenant votre déclaration d'origine de l'opérateur ◉ par ce qui suit:
opérateur infixe ◉: SquareSumOperatorPrecedence

C'est ça.

opérateur infix personnalisé

C'est ça. !

Où aller en partant d'ici?

  • En savoir plus sur la surcharge des opérateurs. Les classes et les structures peuvent fournir leurs propres implémentations des opérateurs existants. Ceci est appelé surcharge des opérateurs existants. Ex: ==, + etc ..
Exemple tiré de apple docs
  • En savoir plus sur l'ajout de contraintes de type génériques aux opérateurs personnalisés

Prendre plaisir!!

Si vous avez aimé lire cet article, partagez et donnez quelques applaudissements pour que les autres puissent le trouver !!!!

Vous pouvez me suivre sur Medium pour des articles frais. Aussi, connectez-vous avec moi sur LinkedIn et Twitter.

Si vous avez des commentaires, des questions ou des recommandations, n'hésitez pas à les poster dans la section des commentaires ci-dessous!