-1
votes

Comment imprimer le nom de la variable à Swift?


8 commentaires

Imprimer ("APIENDPOINT") ?


Vous devez utiliser un dictionnaire au lieu d'une variable, si vous ne voulez pas savoir les noms de variables du code papier dans les appels d'impression.


Il n'y a aucun moyen de faire ce que vous avez littéralement demandé, mais il existe plusieurs approches pour faire des choses similaires. Qu'essayez-vous de faire mal?


J'ai mis à jour ma question. J'ai dit que je veux juste imprimer le nom de la variable.


Je décodage JSON via une fonction commune et je souhaite imprimer le nom de la variable de terminaison lui-même afin que je puisse facilement le chercher dans la fenêtre de débogage en Xcode


Comme @Robnapier a dit, cela ne peut pas être fait. Ce que vous peut faire est de créer une chaîne String sauvegardée Enum pour vos points d'extrémité et utilisez-le à la place.


J'ai mis à jour la question qui utilise la structure. Pouvons-nous imprimer le nom de la variable maintenant?


N ° du point de vue de votre Méthode , tout ce qu'il voit est la Valeur de son point de terminaison Paramètre. D'où cela venait, une variable, une constante, un appel de fonction, peu importe, n'est pas visible.


3 Réponses :


5
votes

Vous pouvez modifier votre structure en un xxx

exemple xxx

APIENDPOINT: Exemple.com/profile?


3 commentaires

Vous êtes sur place, mais pour que je puisse changer la structure à Enum nécessitera beaucoup de changements de code.


@RAYMOND Peut-être peut-être que, mais un énumé pourrait vous donner du code qui est plus facile à lire et plus de sécurité, mais bien sûr, je n'ai aucune idée de combien de travail ce serait


@Raymond plus de changement de code que toute autre méthode? C'est exactement le genre de chose que les énums sont censés, tout le monde ne fait que la faire inutilement compliqué.



2
votes

Vous pouvez utiliser miroir pour réfléchir et faire quelque chose d'idiot comme ceci: xxx

mais je ne recommande jamais de faire quelque chose comme ça et d'utiliser un énumé comme le autre réponse suggérée est probablement la voie à suivre.


7 commentaires

Oui, j'ai vu cette solution mais ce n'est pas pratique que j'ai des centaines de points finaux et je finirai par écrire des centaines de conditions de sière.


@Raymond ne sais pas pourquoi cela vous ferait besoin de centaines de centaines de si / sinon - cela fonctionnera pour un nombre quelconque de points finaux sans avoir besoin d'extra ifs


Désolé je l'ai manqué. Oui, tu as raison. Cependant, cela ne fonctionne pas pour moi. Veuillez noter que je ne passe pas l'API à fonctionner, je ne fais que passer un point final. Je me suis fatigué en faisant miroir = miroir (réfléchissant: API ()) mais cela n'a pas fonctionné, le contrôle ne va pas à l'intérieur de la condition de si.


@Raymond Ouais, je devais ajouter API comme un paramètre si vous le souhaitez que cela fonctionne correctement, ce qui est une autre raison pour laquelle je suggérerais une énumération plutôt que c'est beaucoup plus propre. Cela dit si les points d'extrémité sont constants que les valeurs ne changent jamais, je ne vois pas pourquoi laisser miroir = miroir (réfléchissant: API ()) ne fonctionnerait pas, cela fonctionne pour moi dans mon terrain de jeu.


Le contrôle ne va pas à l'intérieur "pour l'enfant dans miroir.children {"


@Raymond est miroir.children vide? Toute chance que votre API soit statique?


Désolé oui, ils sont statiques. J'ai mis à jour ma question.



1
votes

J'aime l'approche de Quinn, mais je crois que cela peut être fait plus simplement:

struct API {
    let apiEndPoint = "example.com/profile?"
    let apiEndPoint1 = "example.com/user?"

    func name(for string: String) -> String? {
        Mirror(reflecting: self).children
            .first { $0.value as? String == string }?.label
    }
}

func doSomething(endPoint: String) {
    print(API().name(for: endPoint)!)
}

let api = API()

doSomething(endPoint: api.apiEndPoint) // apiEndPoint
doSomething(endPoint: api.apiEndPoint1) // apiEndPoint1


3 commentaires

Il se bloque sur l'impression (API (). Nom (pour: terminal)!). Fil 12: Erreur fatale: Nil trouvé de manière inattendue tout en défaillant une valeur optionnelle. Veuillez noter que j'ai des variables statiques dans la structure. De plus, je n'utilise pas API = API () pour passer la valeur de l'API dans la fonction. Je passe directement API.ENDPoint comme j'ai écrit en question.


@Raymond c'est parce que vos variables sont statiques, les variables statiques n'apparaissent pas dans la réflexion, donc il ne trouve rien et retourne null


Convenu; Ceci n'est probablement pas satisfait pour les propriétés statiques ou les globaux sans ajouter quelque morceau de métadonnées quelque part (créer un dictionnaire de recherche ou créer une structure avec le nom et le chemin, par exemple).