2011-03-05 64 views
10

當我使用LLVM Compiler 2.0時,我似乎遇到了新的錯誤,這是我之前沒有的。重寫符合協議的屬性

我有一個名爲DTGridViewDelegate協議定義爲:

@protocol DTGridViewDelegate <UIScrollViewDelegate>

我有一個名爲delegate on DTGridView屬性(的UIScrollView的一個子類,其本身具有delegate屬性)。這被定義爲:

@property (nonatomic, assign) IBOutlet id<DTGridViewDelegate> delegate;

現在我得到的消息是:

DTGridView.h:116:63: error: property type 'id<DTGridViewDelegate>' is incompatible with type 'id<UIScrollViewDelegate>' inherited from 'UIScrollView'

因爲我曾表示,DTGridViewDelegate符合UIScrollViewDelegate,我認爲這將是確定以覆蓋這個屬性就是這樣的,實際上這是第一個編譯器提示有問題。

@property (nonatomic, assign) IBOutlet id<DTGridViewDelegate, UIScrollViewDelegate> delegate;

我想知道這是否是一個編譯器的問題:

我已經宣佈的財產爲這種固定的錯誤?

回答

8

您的設置看起來像UITableView從UIScrollView繼承的情況下使用的一樣。 UITableViewDelegate協議從UIScrollViewDelegate協議繼承。

我成立這編譯以下罰款:

// .h 
@protocol ParentClassDelegate 
-(NSString *) aDelegateMethod; 
@end 

@interface ParentClass : NSObject { 
    id delegate; 
} 
@property(nonatomic, assign) IBOutlet id <ParentClassDelegate> delegate; 
@end 

//.m 
@implementation ParentClass 
@synthesize delegate; 

-(id) delegate{ 
    return @"Parent delegate"; 
}//-------------------------------------(id) delegate------------------------------------ 

-(void) setDelegate:(id)someObj{ 
    delegate=someObj; 
}//-------------------------------------(id) setDelegate------------------------------------ 
@end 

//.h 
@protocol ChildClassDelegate <ParentClassDelegate> 
-(NSArray *) anotherDelegateMethod; 
@end 

@interface ChildClass : ParentClass{ 
} 
@property(nonatomic, retain) IBOutlet id <ChildClassDelegate> delegate; 
@end 

//.m 
@implementation ChildClass 
//@synthesize delegate; 

-(id) delegate{ 
    return @"childDelegate"; 
}//-------------------------------------(id) delegate------------------------------------ 

-(void) setDelegate:(id)someObj{ 
    delegate=someObj; 
}//-------------------------------------(id) setDelegate------------------------------------ 

@end 

不知道是什麼原因造成您的問題。我要指出,在標題中的UITableViewDelegate協議的樣子:

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> 

...所以也許編譯器會喜歡的東西有時較爲明確。

我會建議一個乾淨的和構建。這解決了很多問題。

+0

我從http://boredzo.org/blog/archives/2009-11-07/warnings開啓嚴格警告,使用Wolf的腳本:http://rentzsch.tumblr.com/post/237349423/hoseyifyxcodewarnings-scpt。這可能解釋了爲什麼你沒有看到警告/錯誤。 – 2011-03-05 15:04:40

+0

雖然你完全正確,但我忘記了UITableViewDelegate,我首先將該代碼作爲基礎!在我看來,第一種方式不應該爲此發出警告。另外,我覺得很奇怪,UITableViewDelegate表示它符合NSObject,當它符合UIScrollViewDelegate時,它本身也符合NSObject。 – 2011-03-05 15:13:46

+3

因此,在與@MikeAbdullah進一步討論後,事實證明我需要在類接口之前放置協議聲明。在編譯器到達我的屬性聲明時,@protocol DTGridViewDelegate並不是說它符合。 – 2011-03-06 18:52:38

4

由於沒有正式的Objective-C語言規範,因此無法說出編譯器是否正常工作。我們可以說的是,蘋果的gcc似乎沒有上述情況的問題,儘管它在概念上不健全,因爲它可以打破Liskov substitution,因爲delegatecovariantUIScrollViewDTGridView(儘管協方差同樣是一個問題)。如果您通過DTGridView代碼期望UIScrollView,然後繼續將delegate設置爲符合UIScrollViewDelegate但不符合DTGridViewDelegate的對象,會發生什麼情況?

+0

這是完全正確的。我覺得奇怪的是,我已經用這兩種方式聲明瞭委託,這會在您描述時破壞,但編譯器只會警告其中的一個。 – 2011-03-05 15:18:14