J'ai écrit une macro dans l'objectif-c pour effectuer une distribution en toute sécurité. Voici à quoi il ressemble jusqu'à présent:
id obj = [dictionary objectForKey:key]; NSString *str = ([obj objectForKey:key] isKindOfClass[NSString class]] ? (NSString *) obj : nil);
3 Réponses :
Donc, écrivez-le comme ça, il suffit de l'envelopper dans do {} tandis que (0) <- et pas seulement entre parenthèses.
XXX PRE> P>
Je ne peux pas obtenir cela pour compiler correctement dans l'utilisation que j'ai utilisée ci-dessus. Les sorties du compilateur: Erreur: expression attendue avant «faire».
Euh tu as raison, désolé. D'abord, il y a une erreur de syntaxe après NIL, manquante; Et deuxièmement, il doit rester seul. Signification, transmettez sous un autre argument qui attribue la sortie de l'opération ternaire ou fais-elle une manière différente. :)
Pas de soucis. En tous cas merci de votre réponse.
Pouvez-vous rappeler à vos lecteurs (comme moi) pourquoi nous voudrions envelopper cela dans un processus? Merci! Aussi, cela fonctionne-t-il? Merci!
Vous voudrez utiliser un processus ou des expressions en conserve afin que vous puissiez l'utiliser dans des endroits qui s'attendent à des expressions et à lancer des erreurs lorsque les énoncés sont rencontrés (si les affections sont un bon exemple).
Vous pouvez utiliser une extension GCC appelée déclaration Expressions d'instruction a> avoir qui dit, je pense que c'est généralement une mauvaise approche d'avoir une situation dans laquelle vous devez utiliser Safe_cast code> beaucoup.
Ne mettez jamais d'objets de différentes classes dans un tableau; Ne jamais réutiliser un message d'action (ibaction) Somction: (ID) Sender code> pour des objets d'interface utilisateur de différentes classes. Ensuite, vous n'avez généralement pas besoin d'utiliser Safe_Cast CODE>. P> P>
En ce moment, j'utilise cette macro lors de la lecture d'informations d'un plist. Je ne suis pas garanti que le contenu du plis est valide. C'est comme n'importe quel autre casting; Cela peut être maltraité, mais il a ses utilisations. S'il y a une meilleure façon de le faire, pourriez-vous s'il vous plaît élaborer? Selon votre réponse, les expressions de déclaration semblent intéressantes. Peuvent-ils être utilisés avec LLVM?
Oui, cela fonctionne avec clang code>. Comme pour Plist code>, je suis d'accord avec Utilisation de Safe_cast CODE> s'il est fourni par l'utilisateur. Mais si ce n'est pas le cas, je pense qu'il est préférable d'utiliser nsassert code> tout en développant, de sorte que le programme se bloque fort lorsque je prépare un plat invalide; La version de la version de votre application ne doit pas nécessairement avoir besoin Safe_cast CODE>, car vous vous assurez que Plist code> est valide.
Je ne dirais pas que c'est une mauvaise approche. Sauf si vous êtes d'accord avec un crash lors de la manipulation de NSDictionary de NSnotification, JSON, des notifications push, etc.
Si vous pensez vraiment que vous devez le faire, vous pouvez utiliser une fonction:
C'est une approche intéressante, mais une macro semblait juste un peu plus propre. J'essaie d'éviter d'avoir des fonctions globales flottantes. Aussi, pourriez-vous s'il vous plaît élaborer sur ce que vous entendez par «si vous pensez vraiment que vous devez le faire»? Plusieurs autres langues prennent en charge la coulée en toute sécurité, y compris C # et C ++. Pourquoi ne devrais-je pas les utiliser?
@Helixed: Pourquoi pensez-vous qu'une macro globale suspendue est meilleure qu'une fonction globale suspendue?
@Helixed: Pour l'approche du plis mentionnée ci-dessus, elle convient, sa situation que si ces moulages dynamiques sont vraiment nécessaires sont rares. Je ne vois pas le problème spécifique avec une fonction globale, mais je préfère utiliser des fonctions que les macros qui ne traitent que le traitement de texte.
Je vois ce que tu veux dire. En dehors de quelques frais généraux négligeables, cela semble être une meilleure approche. Merci.
@Helixed: Tant que la définition est visible au point de l'appel, il n'y aura pas de frais généraux - les compilateurs d'aujourd'hui en ligne de manière agressive, une fonction est spécifiée en ligne code> ou non.
Je ne vois pas ce que le point de ceci est. Vous avez dit que vous voulez l'utiliser pour assainir les plistements, mais sûrement si vous utilisez ceci, vous devez tester si l'objet retourné est nul? Pourquoi pas seulement tester si l'objet IskindofClass: Classe attendue?