Я задавал здесь несколько вопросов об этой русистой игре, которую я пытаюсь сделать. Я работаю над текстовой приключенческой игрой. Сначала я сделал это на Java, потому что это то, чему я изучал класс, в котором игра была. Теперь я пытаюсь изучить разработку iOS, которая требует объективного с. Я чувствую себя довольно комфортно с объективным c после прохождения курса Lynda Essentials (конечно, предыдущий опыт работы с Java помог). В любом случае я работаю над этой игрой, и у меня возникает проблема, которая кажется довольно уникальной для объективного c.Ошибка «Ожидаемый тип» Цель C
В Java, когда у меня есть несколько классов, они просто должны быть в одном каталоге, чтобы я мог использовать их в других классах. Это не так в Objective-C ... Мне нужно импортировать файлы заголовков, если я хочу использовать класс A в классе B. Ну для этой игры у меня есть два пользовательских класса, класс Location и класс Exit. Класс Location должен знать о том, что у него есть (поэтому мне нужно импортировать Exit.h, если я хочу их использовать), и выходы должны знать, к какому местоположению подключено (поэтому мне нужно импортировать Location.h). Кажется, я не могу этого сделать из-за чего-то называемого Circular Referencing (или что-то в этом роде). Однако, если я этого не сделаю, я получаю ошибку «Ожидаемый тип». Поэтому я понятия не имею, что делать. Я покажу код ниже.
Exit.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
Exit.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
Location.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
Location.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
Я действительно надеюсь, что я не пытаюсь сделать что-то, что невозможно. Я также надеюсь, что мой код может быть понятен, и я не слишком обижусь на себя здесь;) спасибо за любые советы.
DanZimm верен. Используйте определение @class для других классов в файлах заголовков, а затем импортируйте файлы заголовков * только * в файлы реализации. – Philip
Это замечательно! Это было то, что не было хорошо освещено в курсе Lynda, поэтому я делал это неправильно. Я рад, что вы поняли это для меня! :) – CaldwellYSR