Utiliser le contenu d'une variable comme nom de méthode
yannS
Membre
Bonjour,
Tout est dans le titre et je comprends que cela puisse sembler bizarre.
J'ai un code PHP dont voici l'extrait simplifié
En gros à partir d'une structure JSON on génère du code SQL
J'ai une classe générateur dans laquelle j'ai ceci
function __construct() {
$this->fonctionsSql = new fonctionsSql($this);
}
.....
$fonction = "INSTR";
$chaine .= $this->fonctionsSql->$fonction($element);
Dans ma classe fonctionSql j'ai une méthode INSTR
En php la méthode en question est bien appelée
Est-ce qu'il est possible de faire la même chose en swift
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Le mieux que j'ai pu faire avec tes infos, c'est :
Merci, mais j'ai peur que cela corresponde au besoin c'est vrai que je n'ai pas donné beaucoup d'infos
J'ai continué mes recherches d'après ce que j'ai compris il serait possible d'utiliser des selectors
J'ai testé ceci :
Malheureusement ça plante à la dernière ligne que j'indique @objc ou pas
ça te semble un voie possible ?
Swift n'est pas une langue interprétée. Bien sûr, avec Objective-C, on peut utiliser les selectors mais, avec Swift, tu ne devrait plus les utiliser ; il y a les autres moyens.
Pourquoi tu veux trouver une méthode par son nom quand tu peux tout simplement l'appeler directement ?
En fait la configuration de la requête SQL à créer est stockée dans une chaîne Json.
Le générateur analyse les diffèrentes propriétés du Json et prépare les différents éléments.
Dans les calculs le générateur peut trouver des fonctions SQL particulières.
Si le générateur trouve une propriété instr par exemple il doit lire d’autres propriétés spécifiques pour créer le code SQL correspondant.
Dans le code PHP d’origine les méthodes de constitution des fonctions portent le nom des fonctions elles-mêmes, je voulais simplement reprendre le même fonctionnement.
Dans ce cas là, peut-être un dictionnaire avec String pour les clés et un closure pour les valeurs :
Ok, merci, une dernière question : de cette manière est-ce qu’il serait possible de passer des arguments aux clôtures?
Oui. Mais il faut avoir le même nombre et type d'arguments. Si tu prévois un nombre variable, il faut les mettre dans un seul objet et les passer comme ça.
Les selectors sont en fait une fonctionnalité d'Objective-C. On peut effectivement faire hériter une classe Swift de NSObject auquel cas il se comporte comme une classe Objective-C, ce qui s'avère nécessaire pour pouvoir s'interfacer avec tout le code ObjC écrit depuis 30 ans.
Oui, c'est normal. Essaie:
Parce qu'en ObjC, -[hello] et -[hello:] sont deux méthodes différentes. La seconde prend un argument.
Oui, mais ce sera sans doute plus compliqué que la solution proposée par Joanna — utiliser un dictionnaire [nom: fonction]. De toute façon, le JSON ne peut référencer que des fonctions prévues.
Si vraiment tu as beaucoup de fonctions, jette un œil à Sourcery pour générer le code.
Pour les paramètres, on peut faire mieux qu'un Array de Any, mais ce n'est qu'un exemple :
Merci pour l'exemple, j'ai légèrement retouché le code, playground n'était d'accord avec tout
Le voici
C'est tout bon, y a plus qu'à ...
Non. Tu ne peux pas écrire
… parce que
fonctions[key]
renvoie une valeur optionnelle. Il ne faut jamais utiliser les!
comme ça !!!Du coup, il faut écrire ce que je t'ai montré avec l'optionnel pour le retour du subscript, et le
if let …
pour gérer la possibilité de ne pas trouver une closure pour le clé que tu envoies.Tout le code que j'ai écrit a été validé en Xcode et fonctionne nickel et je viens de le tester en Playground ; pas de problème là aussi
Et, pour les params plus sécurisés en termes de types :
Mais, attention ! Il ne faut pas changer le
!
et les?
Merci c’est noté