2017-08-24 74 views
0

我在objective-c中實現了一個協議,並且當我使用自己的類作爲類型定義xCode告訴需要一個類型。期望的協議類型

#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.h在文件的頂部導入LPRPhotoCaptureCameraDelegate.h。那麼你有什麼導入週期。

因此,例如,編譯LPRPhotoCaptureCamera.m時,將導入LPRPhotoCaptureCamera.h,這在文件的頂部進口LPRPhotoCaptureCameraDelegate.h(前LPRPhotoCaptureCamera類的聲明)。 LPRPhotoCaptureCameraDelegate.h然後輸入LPRPhotoCaptureCamera.h,但#import保證文件只導入一次,所以此導入不會導入任何內容。因此,當它進入LPRPhotoCaptureCameraDelegate協議聲明的內部時,它指的是LPRPhotoCaptureCamera *,它不理解,因爲LPRPhotoCaptureCamera尚未聲明。

換句話說,雖然LPRPhotoCaptureCameraDelegate.h進口LPRPhotoCaptureCamera.h,import不會實際導入LPRPhotoCaptureCamera,因爲我們已經開始進口(和在中間)LPRPhotoCaptureCamera.h在較高的水平。

處理類型在循環中互相引用的常用方法是使用前向聲明。 LPRPhotoCaptureCameraDelegate的聲明只使用指向LPRPhotoCaptureCamera的指針,所以它實際上不需要聲明LPRPhotoCaptureCamera類 - 它只需要知道它是一個類。像@class LPRPhotoCaptureCamera這樣的前向聲明將會這樣做,這將允許您不再導入LPRPhotoCaptureCamera.hLPRPhotoCaptureCameraDelegate.h。類似地,如果LPRPhotoCaptureCamera的聲明僅在變量的類型中使用LPRPhotoCaptureCameraDelegate,例如, id<LPRPhotoCaptureCameraDelegate> delegate,那麼它實際上並不需要LPRPhotoCaptureCameraDelegate的聲明 - 它只需要知道它是一個協議,所以像@protocol LPRPhotoCaptureCameraDelegate這樣的前向聲明就可以了,並且您不必在LPRPhotoCaptureCamera.h中導入LPRPhotoCaptureCameraDelegate.h。通常,只需要在A的頭文件中導入B的頭文件就是A實現B協議或從B類繼承。

相關問題