typedef struct {
NSString *activty;
NSString *place;
float latitude;
float longitude;
} event;
typedef struct {
event *thing;
Node *next;
} Node;
这是我的.h文件中的代码,用于创建两个用于保存数据的结构(一个用于事件名称/位置/位置,一个用于链接列表的节点。我可以使用事件结构node struct,但是我需要在自身内部使用节点结构。在C ++中这可以工作,但是如何在objective-c中实现呢?谢谢!
答案 0 :(得分:21)
为什么要使用结构?只需使用一个类:
@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
与结构相比没有明显的开销(如果方法调用真的可以测量,你甚至可以直接暴露ivars)。更好的是,当你想要存档结构,添加业务逻辑或做任何有趣的事情时,你可以简单地添加方法。
答案 1 :(得分:2)
您需要像在C中一样命名您的结构。例如:
typedef struct Node {
event *thing;
struct Node *next;
} Node;
更好的问题是,为什么你想首先制作这个链表?为什么不使用框架提供的容器类型之一?
答案 2 :(得分:-1)
我认为你会发现它在C ++中不起作用(但它们可能已经改变了语法规则,所以它确实如此)。你可能意味着更像这样的东西:
struct Node {
event *thing;
Node *next;
};
这适用于C ++,因为Node
等同于struct Node
,如果还没有名为Node
的东西(当Foo
都是类时,这有时会导致令人费解的错误和另一个类的实例方法,它发生在一些编码风格中。)
解决方法是struct Node
。我更喜欢这个;它似乎更纯净。使用typedef有一些很好的理由(例如TUInt64
之类的东西,由于缺乏编译器支持,它们在历史上可能是一个结构体)。如果你确实使用了typedef,那么没有理由给结构赋一个不同的名称,因为它们位于不同的名称空间中(IIRC结构是一个“标记命名空间”)。
通常的typedef版本是这样的:
typedef struct Node Node;
struct Node {
event *thing;
Node *next;
};
或者,将文件扩展名更改为.mm,然后它就可以了,因为您正在编译Objective-C ++!