2012-10-06 6 views
2

Je suis en train de faire une simple vérification en Objective C comme ceci:Réduire le code répétitif?

if ((spriteA.tag == 4 && spriteB.tag == 10)) { 
} 

Cependant, je suis en train d'accomplir contrôle 1if tout en réalisant les éléments suivants:

if ((spriteA.tag == 4 && spriteB.tag == 10,11,12,13,14,15,16,17)) { 
} 

Maintenant, je sais que je peut utiliser l'opérateur ||, mais cela ferait if vérifier plusieurs lignes de code de sorte qu'il aurait l'air illisible. Maintenant, y a-t-il une manière organisée de réaliser ce que j'essaie de faire?

Merci!

+6

'spriteA. tag == 4 && spriteB.tag> = 10 && spriteB.tag <= 17'? –

+0

J'aime mieux la méthode @DanielFischer (je ne savais pas que vous pouviez le faire) car elle n'implique pas l'utilisation de plus de lignes de code (création de NSSets) –

+1

Elle est liée aux valeurs admissibles formant une plage, cependant. Si ce n'est pas toujours le cas, un ensemble serait le chemin. –

Répondre

1

L'approche la plus simple est probablement de faire un masque de bits int spriteBtags = (1 << 10) | (1 << 11) | (1 << 12) | ...; puis de tester avec (1 << spriteB.tag) & spriteBtags. Mais notez que cette approche limite les valeurs de spriteB.tag au nombre de bits dans un int ou long. Et, bien sûr, vous avez la longue déclaration pour créer spriteBtags, mais c'est une tâche ponctuelle.

D'autres langages comme Pascal ont des ensembles de bits, ce qui rend ce genre de chose plus simple.

(Vous pouvez au moins cacher la complexité de la déclaration d'affectation en écrivant une fonction varargs: int spriteBtags = createIntBitset(10,11,12,...17,-1);)

1

Avec des valeurs d'énumération, une déclaration switch peut être utile:

switch(spriteB.tag) { 
case 4: 
case 10: 
case 12: 
case 17: 
case 42: 
    ... 
    break; 
}