2012年10月26日

[Q&A]unknown type name '...'; did yo mean ...?



また質問がありましたので回答します。


添付画像の様に、今度は.hファイルの方にエラーが出てしまいます。
なぜでしょうか


DAViewController.h (親View)

#import <UIKit/UIKit.h>

@interface DAViewController : UIViewController
{
......
}
@property (nonatomic ,retain) DANextView *nextView;
......
@end


DAViewController.m (親View)

#import "DAViewController.h"
#import "DANextView.h"

@implementation DAViewController

- (IBAction)goToNextView:(id)sender {
if ( !self.nextView ) {
DANextView *nextView;nextView = [[DANextView alloc]
initWithNibName:@"DANextView"bundle:[NSBundle mainBundle]];

self.nextView = nextView;

}
[self.navigationController pushViewController:self.nextView animated:YES];
}


エラーメッセージ
unknown type name 'DANextView'; did yo mean UITextView?



本来、iOSプログラミングをするにはハードウェアなどの知識の他にプログラミングの基礎としてC言語、Objective-C(とその発展であるObjective-C 2.0)、その上にアップルが提供しているフレームワークや様々なミドルウェアの知識が必要である。

だが、アップルのフレームワークが強力であるゆえ、ある程度目的のものに近いサンプルプログラムがあれば、それを見よう見まねで改造していけばそれなりのアプリケーションを開発することができる。

だが、やはり基礎となる部分は知らなければならない。学習の段階として基礎からとなると面白くもなく何の役に立つのかもわからない技術を学ぶのは面倒だし気の進む物ではない。だからとっかかりは音楽機能を使ったり画像を描いたりカメラを使うなど作っていて楽しい物を使えるようになり、徐々に技術力を深めていけばいいのだと思う。

この質問はそんな基礎知識が未熟な段階にある人によくあるものだろう。だが、これはコンパイラが出しているメッセージをよく読めば想像できることだ。初心者に是非やってほしいこととして前に書いたことだが、コンパイラが出すエラーや警告のメッセージは重要な問題解決のヒントなのだからきちんと読んで解決方法を考えて欲しい。短い文章なのだから辞書を引けば英語力の問題ではなくきちんと解決できるはず。今ではエラーメッセージ(の固有名詞部分を除けば)Googleで検索すれば解決方法が沢山ヒットするはずだ。

が、一応そんな検索結果のひとつになればと思いここにも解決方法を書いておく。

unknown type name 'xxx'; did yo mean ...?


このエラーメッセージはxxxが使われている場所以前で定義されていないため、その名前がわかりません。っていうことです。進化した統合環境XcodeやコンパイラLLVMのおかげで文字列補完が効いたりしてわかりにく部分がありますが、基本はソースコードの先頭から定義を読んでクラス名や変数名を知って使えるようになります。だから、この場合プロパティ宣言しているDANextViewをそれ以前ではどこでも定義されていません。だから定義する必要があります。通常はインポート文で定義しているヘッダファイルを読み込みます。


#import <UIKit/UIKit.h>
#import "DANextView.h"


でも、ここでDANextViewがこのDAViewControllerクラスを参照していたらどうなるでしょうか?DANextViewをDAViewController以前に定義しなければならず、DAViewControllerはDANextView以前に定義しなければならない。そんなの無理。こういうのを相互参照というがこれの対策のためにあるのが@class。


#import <UIKit/UIKit.h>
@class DANextView;

@interface DAViewController : UIViewController
{
......
}
@property (nonatomic ,retain) DANextView *nextView;
......
@end


これでエラーは解消されるはず。
posted by 永遠製作所 at 16:10| 東京 ☀| Comment(1) | TrackBack(0) | iPhone/iPod touch | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
できました!!有り難うございます。
仰る通り、見よう見まねでやっていますので、これから時間をかけて基礎をもっと学習したいと思います。いつも適切なアドバイスを頂きまして本当に有り難うございます!
Posted by 石黒 at 2012年10月26日 23:24
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/299113815
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック