Obtenez rapidement une Variable de Nom Réel comme une Chaîne de caractères
Donc je suis en train d'essayer d'obtenir le véritable Nom de la Variable comme une Chaîne de caractères dans Swift, mais n'ont pas trouvé un moyen de le faire... ou peut-être que je suis à la recherche à ce problème et de la solution dans un mauvais angle.
C'est donc, fondamentalement, ce que je veux faire:
var appId: String? = nil
//This is true, since appId is actually the name of the var appId
if( appId.getVarName = "appId"){
appId = "CommandoFurball"
}
Je n'ai malheureusement pas été en mesure de trouver dans apple docs tout ce qui est proche de cela, mais c':
varobj.self or reflect(var).summary
cependant, cela donne de l'information de ce qui est à l'intérieur de la variable elle-même ou le type de la variable dans ce cas étant de Chaîne et je veux bien le nom de la Variable.
- De quoi êtes-vous en train d'essayer de réaliser à partir de le nom d'une variable? Ce n'est pas le JavaScript ou Python. Les langages dynamiques comme ceux de garder cette information autour de vous au moment de l'exécution. En Swift, les noms de variables sont purement à titre de commodité pour le programmeur (de façon à donner des noms à des adresses de mémoire), et ils n'existent pas dans le programme lors de l'exécution.
- pour NSPredicates il est utile 🙂
- Les réponses semblent être à la question, "Comment puis-je obtenir les biens et les noms de méthode d'une Classe, meta pour juste les connaître." Mais, je pense que la question d'origine était plus comme bob.dofunction(ted), comment peut-dofunction trouver les chaînes "bob" et "ted". Je suis en train d'écrire TUITest Code qui s'auto génère du code pour la sortie, il serait agréable d'avoir de savoir son nom. Mais, il a marqué comme réponse correcte, donc il doit avoir réussi à le faire fonctionner. Aussi, où est la valeur de retour de NSPredicate qui répond à la question?
Vous devez vous connecter pour publier un commentaire.
Selon la mise à jour de cette réponse, il est pris en charge dans Swift 3 via
#keyPath
foo
(dans n'importe son type) je pensais que la question était " comment obtenez-vous à la chaîne "toto", de le stocker dans une autre variable? Comme exemple, voici comment le faire en C#:string nameOfFoo = nameof(foo);
Maintenant, la valeur stockée dansnameOfFoo
est la chaîne "toto"C'est officiellement pris en charge dans Swift 3 à l'aide de
#keyPath()
https://github.com/apple/swift-evolution/blob/master/proposals/0062-objc-keypaths.md
Exemple d'utilisation serait:
Dans Swift 4 nous avons quelque chose d'encore mieux:
\KeyPath
notationhttps://github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.md
Le raccourci est un ajout bienvenu, et d'être en mesure de référence keypaths à partir d'une variable est extrêmement puissant
value(forKeyPath:)
etsetValue(_, forKeyPath)
permettre d'effectuer le changement par le biais de ce #chemin d'accès clé() utiliser. IMO ce devrait être le nouveau accepté réponse rapide 3.class Person { let firstName: String }
. Si l'exemple semble étrange à vous, je suggère la lecture sur NSPredicates, ils sont très puissant lorsque l'on travaille avec des collectionskeyPath
n'est pas une Chaîne directement, ce qui l'Objective-C runtime attend pour le prédicat de l'initialiseur. SiPerson
est, par exemple, une Base de Données générée sous-classe de NSManagedObject cela ne fonctionne pas comme ça, commekeyPath
ne peuvent pas être convertis à la "Objective-C-comme" la clé, c'est à dire une Chaîne de caractères (ouNSString
). Ai-je raté quelque chose?C'est ma solution
impression sera
La meilleure solution est Ici
Partir du lien donné
}
Cela fonctionne:
J'ai trouvé rapidement une solution, mais malheureusement, il ne fonctionne pas avec Ints, des Flotteurs, et en Double je crois.
Il compare les adresses de mémoire pour les propriétés d'un objet et voit si n'importe quel match.
La raison pour laquelle cela ne fonctionne pas pour Ints, des Flotteurs, et en Double, car ils ne sont pas de type anyobject, bien que vous pouvez les passer comme anyobject, lorsque vous le faites, ils sont convertis au NSNumbers. par conséquent, la mémoire, le changement d'adresse. ils en parlent ici.
Pour mon application, il n'a pas nuire à moi, car je n'en avait besoin pour les classes personnalisées. Alors peut-être que quelqu'un va trouver cela utile. Si n'importe qui peut faire ce travail avec les autres types de données alors que ce serait plutôt cool.