2012-06-17 2 views
3

Я задавал здесь несколько вопросов об этой русистой игре, которую я пытаюсь сделать. Я работаю над текстовой приключенческой игрой. Сначала я сделал это на 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 

Я действительно надеюсь, что я не пытаюсь сделать что-то, что невозможно. Я также надеюсь, что мой код может быть понятен, и я не слишком обижусь на себя здесь;) спасибо за любые советы.

ответ

5

EDIT: Просто перечитайте и теперь лучше понять, что вам нужно сделать @class Exit; определить класс Выход в заголовке Location, а затем вы можете сделать в заголовке Выход тот же @class Location; для того, чтобы сообщить компилятору, что классы определены. Затем, если вы должны были ссылаться на эти классы в файлах реализации (.m), вы должны импортировать файл Exit.h и файл Location.h соответственно.

+0

DanZimm верен. Используйте определение @class для других классов в файлах заголовков, а затем импортируйте файлы заголовков * только * в файлы реализации. – Philip

+0

Это замечательно! Это было то, что не было хорошо освещено в курсе Lynda, поэтому я делал это неправильно. Я рад, что вы поняли это для меня! :) – CaldwellYSR

4

Правило я начал следовать, который, казалось нелогичным мне сначала это:

В ваших заголовочных файлах, используйте «вперед заявление» многоплодна только 2 исключения: заголовков для классов, которые вы расширяете, и заголовков для протоколов, которые вы соответствуете; и только #import директивы в ваших .m файлах.

Это должно устранить круговую ошибку ссылки; он сделал мой.

См. here и сделайте слово «найти» для слова «вперед».

+0

Похоже, что ваш ответ такой же, как у DanZimm, но я не понял некоторые термины поэтому я принял его, а не твое. – CaldwellYSR

+0

Спасибо за примечание :-) Привет! –