2011-03-05 4 views
10

मुझे एलएलवीएम कंपाइलर 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

आपका सेटअप UIScrollView से प्राप्त UITableView के मामले में उपयोग किए जाने वाले समान दिखता है। 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 से कठोर चेतावनियां चालू की: http://rentzsch.tumblr.com/post/237349423/hoseyifyxcodewarnings-scpt। जो शायद बताता है कि आपको चेतावनी/त्रुटि क्यों नहीं दिखाई दे रही है। –

+0

हालांकि आप पूरी तरह से सही हैं, मैं UITableViewDelegate के बारे में भूल गया, जिसे मैंने पहली बार उस कोड पर आधारित किया था!ऐसा लगता है कि पहले तरीके से इसके लिए चेतावनी फेंकना नहीं चाहिए। साथ ही, मुझे यह अजीब लगता है कि UITableViewDelegate का कहना है कि यह NSObject के अनुरूप है जब यह UIScrollViewDelegate के अनुरूप भी है, जो स्वयं एनएसओब्जेक्ट के अनुरूप है। –

+3

तो @ माइक अब्दुल्ला के साथ कुछ और चर्चा के बाद, यह पता चला कि मुझे कक्षा इंटरफ़ेस से पहले प्रोटोकॉल घोषणाओं को रखने की आवश्यकता है। @protocol DTGridViewDelegate यह नहीं कह रहा था कि जब तक संकलक मेरी संपत्ति घोषणा तक पहुंच गया था तब तक यह के अनुरूप था। –

4

चूंकि कोई औपचारिक उद्देश्य-सी भाषा विनिर्देश नहीं है, इसलिए यह कहना असंभव है कि संकलक ठीक से व्यवहार कर रहा है या नहीं। हम सब कुछ कह सकते हैं कि ऐप्पल के जीसीसी को उपर्युक्त परिदृश्य में कोई समस्या नहीं लगती है, हालांकि यह तो तो covariantUIScrollView से DTGridView (हालांकि कॉन्वर्सिस उतनी ही समस्या है) के बाद यह अवधारणात्मक रूप से बेकार है। क्या होगा यदि आप DTGridView को UIScrollView की अपेक्षा रखने वाले कोड पर पास करते हैं, तो पर किसी ऑब्जेक्ट परपर सेट करने के लिए आगे बढ़े, लेकिन DTGridViewDelegate नहीं?

+0

यह पूरी तरह से सच है। मुझे अजीब लगता है कि दोनों तरीकों से मैंने प्रतिनिधि घोषित कर दिया है, जैसा कि आप वर्णन करते हैं, यह तोड़ देगा, फिर भी संकलक केवल उनमें से एक के खिलाफ चेतावनी देता है। –