2010-11-23 7 views
8
typedef struct { 
    NSString *activty; 
    NSString *place; 
    float latitude; 
    float longitude; 
} event; 

typedef struct { 
    event *thing; 
    Node *next; 
} Node; 

C'est le code que j'ai dans mon fichier .h pour créer deux struct pour conserver des données (un pour un nom d'événements/lieu/emplacement, et un pour les noeuds d'une liste chaînée Je peux utiliser l'événement struct dans le noeud struct, mais j'ai besoin d'utiliser le noeud struct en lui-même, en C++ cela fonctionnera, mais comment puis-je l'atteindre en objectif-c? Merci!Création de listes liés à Objective C

Répondre

21

Pourquoi s'embêter avec un struct? Il suffit d'utiliser une classe:

@interface MyEvent:NSObject 
@property(copy) NSString *activity; 
@property float latitude; 
... etc ... 
// and that linked list gunk 
@property(retain) MyEvent *nextEvent; 
@end 

@implementation MyEvent 
@synthesize activity, latitude, nextEvent; 

- (void) dealloc 
{ 
    [activity release], activity = nil; 
    [nextEvent release], nextEvent = nil; 
    [super dealloc]; 
} 
@end 

Il n'y a pas de frais généraux par rapport à une importante structure (si les appels de méthode sont vraiment mesurables, vous pourriez même exposer directement Ivars). Mieux encore, au moment où vous voulez archiver la structure, ajouter une logique métier ou faire quelque chose d'intéressant, vous pouvez simplement ajouter des méthodes.

+0

Pas une liste liée. –

+0

@tc, ni la structure 'event' d'origine de l'OP, bbum signale qu'une classe serait une meilleure alternative à une structure C de vanilla pour les raisons mentionnées ci-dessus. – dreamlax

+1

Là; maintenant c'est une liste chaînée. :) – bbum

2

Vous devez le nom de votre structure comme vous le feriez dans C. Par exemple:

typedef struct Node { 
    event *thing; 
    struct Node *next; 
} Node; 

Une meilleure question, cependant, est de savoir pourquoi voulez-vous faire t sa liste liée en premier lieu? Pourquoi ne pas utiliser l'un des types de conteneur fournis par le framework?

+0

Que recommanderiez-vous d'utiliser à la place pour garder plusieurs types de données connectés? Dois-je simplement stocker mes structures d'événements dans un NSMutableArray? – Inanepenguin

+0

Ce serait la chose normale. Si vous voulez une approche composite (par exemple, vous pouvez passer des structures simples au code C existant), vous pouvez utiliser NSValue + valueWithPointer: pour créer un objet capable d'aller dans une collection Objective-C mais qui ne fait que pointer vers autre chose. – Tommy

+0

Une dernière question: je ne peux pas utiliser addObject pour pousser la structure vers le tableau ... Quelle serait la bonne façon de le faire? Je vous remercie! – Inanepenguin

-1

Je pense que vous trouverez que cela ne fonctionne pas en C++ (mais ils ont peut-être changé les règles de grammaire). Vous voulez dire probablement quelque chose comme ceci:

struct Node { 
    event *thing; 
    Node *next; 
}; 

Cela fonctionne en C++, car Node est équivalent à struct Node s'il n'y a pas déjà quelque chose appelé Node (ce qui provoque parfois des erreurs embarrassantes quand Foo est à la fois une classe et la méthode d'instance d'une autre classe, ce qui arrive dans certains styles de codage).

La correction est de dire struct Node. Je préfère ça; il semble plus pur. Il y a de bonnes raisons d'utiliser un typedef (par exemple des choses comme TUInt64 qui pourrait avoir été historiquement une structure en raison du manque de support du compilateur). Si vous utilisez un typedef, il n'y a pas de raison de donner un nom différent à la structure car ils se trouvent dans des espaces de noms différents (les structures de l'IIRC sont un "espace de noms de balises").

La version habituelle typedef est quelque chose comme ceci:

typedef struct Node Node; 
struct Node { 
    event *thing; 
    Node *next; 
}; 

Vous pouvez également changer l'extension du fichier à .mm puis cela fonctionne parce que vous compilez Objective-C++!

Questions connexes