2011-11-12 17 views
40

私はコンパイルしようとしましたが、そのたびに1つのメソッドが奇妙な "予期した型"エラーを投げます。メソッドの戻り値の型を指す "予想される型のエラー"

-(ANObject *)generateSomethingForSomethingElse:(NSString *)somethingElse; 

このメソッドの戻り値型でエラーが発生しました。私はなぜ、この出来事が..です細かい

#import "ANObject.h"を使用してヘッダにANObjectをインポートし、ANObjectコンパイルされましたか?

+0

あなたのコードの一部を投稿できますか? – Devarshi

+0

他のフレームワークのANObject部分ですか? – Devarshi

+4

質問を編集して、ANObject.hの内容と問題の原因となるヘッダーの両方を含めるようにしてください。そして、実際のコードを表示してください。問題を含んでいない可能性のあるメークアップコードではありません。 –

答えて

89

これは、ソースファイルがでコンパイルされている順序で行うことですあなたはすでにそれが定義される前にメソッドを呼び出すことはできませんことを、おそらく認識しています(擬似コード下記参照):。

var value = someMethod(); 

function someMethod() 
{ 
    ... 
} 

このsomeMethod()がまだ定義されていないため、コンパイル時エラーが発生します。同じことがクラスにも当てはまります。クラスはコンパイラによって次々にコンパイルされます。

コンパイルする前にすべてのクラスを巨大なファイルに入れると想像すれば、すでに問題を見ることができます。さんはShipBoatYardクラスを見てみましょう:

@interface BoatYard : NSObject 
@property (nonatomic, retain) Ship* currentShip; 
@end 

@interface Ship : NSObject 
@property (nonatomic, retain) NSString* name; 
@property (nonatomic, assign) float weight; 
@end 

もう一度、Shipクラスがまだ定義されていないため、我々はまだそれを参照することはできません。この特定の問題を解決するのは簡単です。コンパイル順序を変更してコンパイルします。私はあなたがXcodeで、この画面でfamilliarだと確信している:

しかし、あなたは上下リスト内のファイルをドラッグすることができますことを知っていますか?これにより、ファイルがコンパイルされる順序が変更されます。したがって、ShipクラスをBoatYardクラスの上に移動すると、すべてが良好です。

しかし、そうしたくない場合や、もっと重要なことは、2つのオブジェクト間に循環関係がある場合はどうなりますか?今、私たちが問題を抱えている、

@interface BoatYard : NSObject 
@property (nonatomic, retain) Ship* currentShip; 
@end 

@interface Ship : NSObject 
@property (nonatomic, retain) BoatYard* currentBoatYard; 
@property (nonatomic, retain) NSString* name; 
@property (nonatomic, assign) float weight; 
@end 

ああ親愛なる:さんはShipがである現在のBoatYardへの参照を追加することによって、そのオブジェクト図の複雑さを増加させてみましょう。これらの2つを並べてコンパイルすることはできません。 Ship *クラスが実際に存在することをコンパイラーに通知する方法が必要です。このため、@classというキーワードはとても便利です。

素人の言い方で言えば、「私を信頼してください、Shipは本当に存在し、すぐにそれが見えます。それをすべて一緒に置くために:それはBoatYardをコンパイルするよう

@class Ship; 

@interface BoatYard : NSObject 
@property (nonatomic, retain) Ship* currentShip; 
@end 

@interface Ship : NSObject 
@property (nonatomic, retain) BoatYard* currentBoatYard; 
@property (nonatomic, retain) NSString* name; 
@property (nonatomic, assign) float weight; 
@end 

を今コンパイラがShipクラス定義がすぐに表示されますことを、知っています。もちろん、そうでなければ、コンパイルは成功します。

すべての@classキーワードは、クラスがすぐに来ることをコンパイラに通知します。 #importの代わりではありません。あなたはまだヘッダファイルをインポートする必要があります。または、クラスの内部のいずれかにアクセスすることはできません。

@class Ship 

-(void) example 
{ 
    Ship* newShip = [[Ship alloc] init]; 
} 

これは動作しないことができる、そして船は前方宣言であるというエラーメッセージで失敗します。 #import "Ship.h"になると、オブジェクトのインスタンスを作成することができます。

+0

スティーブ、これが起こる理由を説明できますか?歓声 – theiOSDude

+2

@ burrows111:反射すると、それはかなり怠惰な答えです。私はそれを書いたときに急いでいたに違いない。他の答えはそれを解決する方法を説明しますが、なぜそれが起こるのか説明するものはありません。編集された答えがあなたに役立つことを願っています。 –

+0

はもっと意味をなさない!うれしいバディ! – theiOSDude

1

通常、このようなエラーが表示されるのは、余分な行か括弧の欠落など、前の行にタイプミスがあるためです。

52

ヘッダーに循環依存がある場合、このエラーが発生しました。あなたは、このメソッドを宣言する.hファイルがANObject.h

+2

はい、循環依存のために同様のエラーが発生していました。インターフェイスファイルにフォワードクラス宣言を組み込み、実装にヘッダーファイルをインポートすることで回避しました。 –

+0

これは私にとってはうまくいく:)、ありがとう! – mm24

22

にインポートされている場合は、基本的に@interface前

@class ANObject; 

を追加チェック!

+0

私はどのように知っていませんが、これは私の問題を解決しました。 #import doesnt workと@class works .. – dreampowder

+0

それはあなたのためにうまくいきます:)常に幸せに助けてください – JomanJi

1

変数タイプのスペルが間違っていたときに、このメッセージが表示されました。下記を参照してください。

代わりの

-(void)takeSimulatorSafePhotoWithPopoverFrame:(GCRect)popoverFrame { 

.....

-(void)takeSimulatorSafePhotoWithPopoverFrame:(CGRect)popoverFrame { 
+3

CGRectとGCRectの違いがあると分かりました。 – OlivaresF

4

ので、パラメータの列挙型とメソッドを設定しようとしているときに、私はこのエラーを得ていたいくつかの理由があります。これと同じように:

- (void)foo:(MyEnumVariable)enumVariable; 

私は以前、このようにそれを使用し、決して問題があったが、今私がやっていました。私は循環依存性をチェックして、何も見つけられませんでした。私はまた、複数回のタイプミスやダイスがないかチェックしました。私の問題を解決したのは、変数にアクセスする前に 'enum'を追加することでした。これと同じように:

- (void)foo:(enum MyEnumVariable)enumVariable; 
{ 
    enum MyEnumVariable anotherEnumVariable; 
} 
1

それは愚かに聞こえるかもしれないが、間違った砲撃や大文字/小文字letterwrongケース本の間違った使用。

+0

私はそれらの手紙のような場合が嫌いです! – DiscDev

0

奇妙なことに、奇妙なことに、私の輸入順を変更することで過去にこれが解決されました。他のすべての輸入品を輸入した後、輸入を底まで動かしてみてください。

関連する問題