2017-08-24 12 views
0

私はobjective-cでプロトコルを実装しました。タイプ定義として独自のクラスを使用すると、型が必要であることがわかります。プロトコルで期待される型

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

#import "LPRPhotoCaptureCamera.h" 

@protocol LPRPhotoCaptureCameraDelegate <NSObject> 

- (void)camera:(LPRPhotoCaptureCamera *)camera finishedCapturingPhoto:(UIImage *)capturedUIImage; 

@end 

私はりんごの代表からヘッダファイルで見て、@class LPRPhotoCaptureCameraと私のプロトコルを編集し、それが動作します。

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

#import "LPRPhotoCaptureCamera.h" 

@class LPRPhotoCaptureCamera; 
@protocol LPRPhotoCaptureCameraDelegate <NSObject> 

- (void)camera:(LPRPhotoCaptureCamera *)camera finishedCapturingPhoto:(UIImage *)capturedUIImage; 

@end 

xCodeがここでUIImageのエラーをスローしないのは不思議ですが、これについての説明はありますか?

+1

'UIImage'は' UIKit'で定義されており、あなたは '#import 'をインポートしました。しかし、前もって、「LPRPhotoCaptureCamera」はまだ「未定義」ではない。 – Larme

+1

フォワード宣言 '@class LPRPhotoCaptureCamera'を使用する場合、' #import "LPRPhotoCaptureCamera.h" "は必要ありません。 –

答えて

0

ファイルの先頭にLPRPhotoCaptureCamera.hLPRPhotoCaptureCameraDelegate.hをインポートしている可能性があります(ファイルを表示していないため推測しています)。だからあなたは輸入サイクルを持っています。

LPRPhotoCaptureCamera.mをコンパイルするときに、たとえば、それは(LPRPhotoCaptureCameraクラスの宣言の前に)ファイルの先頭にLPRPhotoCaptureCameraDelegate.hをインポートLPRPhotoCaptureCamera.hを、インポートします。 LPRPhotoCaptureCameraDelegate.h次にLPRPhotoCaptureCamera.hをインポートしますが、#importはファイルが1回だけインポートされることを保証します。したがって、このインポートは何もインポートしません。したがって、LPRPhotoCaptureCameraDelegateプロトコルの宣言の内部に入るときは、LPRPhotoCaptureCameraがまだ宣言されていないため、理解できないタイプLPRPhotoCaptureCamera *を参照します。我々はすでに輸入開始しているので、つまり

LPRPhotoCaptureCamera.h輸入 LPRPhotoCaptureCameraDelegate.hものの、その輸入は、実際に LPRPhotoCaptureCameraをインポートしていない(との中間にある)、より高いレベルで LPRPhotoCaptureCamera.h

型がサイクルで互いに参照するときに対処する通常の方法は、前方宣言を使用することです。 LPRPhotoCaptureCameraDelegateの宣言はLPRPhotoCaptureCameraへのポインタしか使用しないので、実際にはLPRPhotoCaptureCameraクラスの宣言が必要ではありません。クラスであることを知る必要があります。 @class LPRPhotoCaptureCameraのような前方宣言は、をLPRPhotoCaptureCameraDelegate.hにインポートすることはできなくなります。同様に、LPRPhotoCaptureCameraの宣言が変数の型でLPRPhotoCaptureCameraDelegateを使用する場合のみです。 id<LPRPhotoCaptureCameraDelegate> delegateの場合、実際にはLPRPhotoCaptureCameraDelegateという宣言は必要ありません。プロトコルであることを知る必要があります。@protocol LPRPhotoCaptureCameraDelegateのような前方宣言が行われ、LPRPhotoCaptureCamera.hにはLPRPhotoCaptureCameraDelegate.hをインポートする必要はありません。通常、AのヘッダーにBのヘッダーをインポートする必要があるのは、AがBプロトコルを実装しているか、Bクラスから継承している場合だけです。

関連する問題