3

关于我正在尝试制作的这款红润游戏,我已经在这里问了很多次问题。我正在开发基于文本的冒险游戏。首先,我用 Java 制作它,因为这就是我正在学习的游戏课程。现在我正在尝试学习需要objective-c的iOS开发。参加完 Lynda Essentials 课程后,我对 Objective c 感觉很舒服(当然,以前的 Java 经验有帮助)。无论如何,我正在开发这款游戏,但我遇到了一个对目标 c 来说似乎非常独特的问题。

在 Java 中,当我有多个类时,它们只需要在同一个目录中,以便我在其他类中使用它们。在 Objective-C 中不是这种情况...如果我想在 B 类中使用 A 类,我必须导入头文件。对于这个游戏,我有两个自定义类,一个 Location 类和一个 Exit 类。Location 类需要知道它有什么出口(所以如果我想使用它们,我必须导入 Exit.h)并且出口需要知道它连接到哪个位置(所以我必须导入 Location.h)。由于称为循环引用(或类似的东西)的东西,我似乎不能这样做。但是,如果我不这样做,则会收到“预期类型”错误。所以我不知道该怎么做。我将在下面显示代码。

退出.h

#import <Foundation/Foundation.h>
#import "Location.h"

#define NORTH 0
#define SOUTH 1
#define EAST  2
#define WEST  3

@interface Exit : NSObject

@property NSString * dirName;
@property NSString * dirShortName;
@property int direction;
@property Location * connection;
-(id)initWithConnection:(Location *) loc andDirection:(int) dir;

@end

退出.m

#import "Exit.h"

@implementation Exit

@synthesize dirName;
@synthesize dirShortName;
@synthesize direction;
@synthesize connection;

-(id)initWithConnection:(Location *)loc andDirection:(int)dir {
  self = [super init];
  if(self) {
    direction = dir;
    switch(direction) {
      case 0:
        dirName = @"North";
        dirShortName = @"N";
        break;
      case 1:
        dirName = @"South";
        dirShortName = @"S";
        break;
      case 2:
        dirName = @"East";
        dirShortName = @"E";
        break;
      case 3:
        dirName = @"West";
        dirShortName = @"W";
        break;
    }
    connection = loc;
  }
  return self;
}

@end

位置.h

#import <Foundation/Foundation.h>

@interface Location : NSObject

@property NSString * title;
@property NSString * desc;
@property NSMutableDictionary * exits;
@property BOOL final;

-(id) initWithTitle:(NSString *) _title;
-(id) initWithDescription:(NSString *) _desc;
-(id) initWithTitle:(NSString *) _title andDescription:(NSString *) _desc;
-(void) addExit:(Exit *) _exit;

@end

位置.m

#import "Location.h"

@implementation Location

@synthesize title;
@synthesize desc;
@synthesize exits;
@synthesize final;

-(void) addExit:(Exit *) _exit {

  NSString * tmpName = [_exit dirName];
  NSString * tmpShortName = [_exit dirShortName];
  [exits setObject:tmpName forKey:tmpShortName];

}

-(NSString *)description {
  NSString * tmp = [[NSString alloc] initWithFormat:@"%@\n%@\n",self.title,self.desc];
  for(NSString * s in exits) {
    [tmp stringByAppendingFormat:@"\n%@",s];
  }
  return tmp;
}

// Initialization Methods
-(id) init {
  self = [super init];
  if(self) {
    title = @"";
    desc = @"";
  }
  return self;
}

-(id) initWithTitle:(NSString *) _title {
  self = [super init];
  if(self) {
    title = title;
    desc = @"";
    exits = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil];
  }
  return self;
}

-(id) initWithDescription:(NSString *) _desc {
  self = [super init];
  if(self) {
    title = @"";
    desc = desc;
    exits = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil];
  }
  return self;
}

-(id)initWithTitle:(NSString *) _title andDescription:(NSString *)_desc {
  self = [super init];
  if(self) {
    title = title;
    desc = desc;
    exits = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil];
  }
  return self;
}

@end

我真的希望我不会尝试做一些不可能的事情。我也希望我的代码可以被理解,并且我不会在这里自欺欺人;)感谢您的任何建议。

4

2 回答 2

5

编辑:只需重新阅读并现在更好地理解,您需要@class Exit;在 Location 标头中定义 Exit 类,然后您可以@class Location;在 Exit 标头中执行相同操作,以告诉编译器已定义类。然后,如果您要在实现文件 (.m) 中引用这些类,那么您将分别导入Exit.h文件和Location.h文件

于 2012-06-17T01:27:05.707 回答
4

我开始遵循的经验法则,起初对我来说似乎是违反直觉的:

在你的头文件中,大量使用“前向声明”,只有两个例外:你正在扩展的类的头文件,以及你所遵循的协议的头文件;并且只在您的文件中执行#import指令。.m

这应该解决循环引用错误;它确实是我的。

这里,并为“前进”这个词做一个“查找” 。

于 2012-06-17T01:26:45.813 回答