3

私が作ろうとしているこの血色の良いゲームについて、私はここで何度も質問をしました。私はテキストベースのアドベンチャーゲームに取り組んでいます。最初にJavaで作成したのは、それがゲームのクラスを学んでいたからです。今私はobjective-cを必要とするiOS開発を学ぼうとしています。Lynda Essentialsコースを受講した後は、Objective Cにかなり満足しています(もちろん、以前のJavaの経験が役に立ちました)。とにかく私はこのゲームに取り組んでいて、ObjectiveCにかなり特有のように見える問題に遭遇しています。

Javaでは、複数のクラスがある場合、他のクラスでそれらを使用するには、それらが同じディレクトリにある必要があります。これはObjective-Cには当てはまりません...クラスBでクラスAを使用する場合は、ヘッダーファイルをインポートする必要があります。このゲームでは、LocationクラスとExitクラスの2つのカスタムクラスがあります。Locationクラスは、Exitが何であるかを知る必要があり(したがって、Exit.hを使用する場合は、Exit.hをインポートする必要があります)、Exitは、接続されている場所を知る必要があります(Location.hをインポートする必要があります)。循環参照(またはそのようなもの)と呼ばれるもののために、これを行うことができないようです。ただし、これを行わないと、「予期されたタイプ」エラーが発生します。だから私は何をすべきか分かりません。以下にコードを示します。

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

不可能なことをやろうとしないことを本当に望んでいます。また、私のコードが理解できることを願っています。ここでは、自分を馬鹿にしすぎないようにしています;)アドバイスをありがとうございます。

4

2 に答える 2

5

編集:もう一度読んで理解を深めてください。Location@class Exit;ヘッダーでExitクラスを定義する必要があります。次に@class Location;、クラスが定義されていることをコンパイラーに通知するために、Exitヘッダーで同じことを行うことができます。次に、実装ファイル(.m)でこれらのクラスを参照する場合は、Exit.hファイルとLocation.hファイルをそれぞれインポートします。

于 2012-06-17T01:27:05.707 に答える
4

私が従い始めた経験則は、最初は直感に反しているように見えましたが、これは次のとおりです。

ヘッダーファイルでは、2つの例外を除いて、 「前方宣言」を多用します。拡張するクラスのヘッダーと、準拠しているプロトコルのヘッダーです。#importファイルでディレクティブのみを実行し.mます。

これにより、循環参照エラーが解決されます。それは私のものでした。

ここを参照して、 「forward」という単語を「検索」してください。

于 2012-06-17T01:26:45.813 に答える