2010-08-14 7 views
3

J'ai un NSArray qui contient deux types d'objets. Appelons-les Apple et Orange. Quand je construis ma cellule, je ne sais pas quel type est dans mon tableau, pommes ou oranges. Comment puis-je utiliser le type d'ID générique pour stocker l'objet, puis lancer correctement?Comment utiliser la variable id dans objective-c?

Répondre

2

Vous pouvez utiliser isKindOfClass:(Class)aClass pour tester le type de classe:

if ([myObject isKindOfClass:[Apple class]]) 
    // do stuff 

Je ne sais pas pourquoi vous pensez que vous devez jeter cependant. NSArray ne se soucie pas du type d'objet que vous y stockez, donc quand vous le sortirez, ce sera toujours le même objet. Mais si vous voulez vous pouvez toujours jeter en faisant quelque chose comme

Apple *myApple = (Apple *)myObject; 

Quoi qu'il en soit, connaissant le type de classe, il est devrait être suffisant pour vous de prendre des mesures appropriées, car je crois savoir que vous montrant les deux types de la même table, tout ce que vous avez vraiment besoin de faire est d'afficher de manière appropriée leurs différentes propriétés. Ne pas mélanger les types de classes dans un NSArray.

+0

Vous n'avez pas besoin de convertir, mais si vous utilisez object.property pour utiliser les propriétés d'un objet, vous devez le convertir au type approprié. Sinon, vous pouvez simplement utiliser [object property] et [object setProperty: x] pour accéder à une propriété. – lucius

+0

@lucius: c'est pourquoi vous devriez le faire de toute façon! : P –

2

Vous pouvez le faire, vous pouvez lancer des vérifications pour le type - mais c'est une très mauvaise idée, SAUF si elles font partie de la même arborescence de sous-classes (disons, les deux dérivées de Fruit). Alors au moins quelque chose regarde là-dedans peut supposer quel genre de Fruit il pourrait être, et vérifie pour des détails. Fondamentalement vous vous épargnerez beaucoup de maux de tête si vous ne mélangez pas les types dans les classes de conteneurs, quand quelque part sur la route des chiffres de code pour une raison quelconque, il n'y a que des pommes mais quelqu'un jette dans une poire. Ensuite, BOOM!

+1

Je pense qu'une meilleure façon d'énoncer ceci est: Ne mélangez pas les types dans un conteneur à moins que vous ayez l'intention de les utiliser de façon polymorphique. Je peux penser à plusieurs façons d'utiliser des objets de types différents polymorphiquement quand ils ne partagent ni une classe de base ni un protocole. Dans l'ensemble, cependant, je partage votre opinion. (Au fait, je ne parle pas nécessairement de polymorphisme formel.) –

+0

C'est une bien meilleure façon de mettre ce que j'essayais de dire, même si j'essayais de garder les choses simples ... ce que vous avez dit est beaucoup plus précis et la façon dont j'essaie de garder les choses. –

Questions connexes