जवाबों:
" औपचारिक प्रोटोकॉल " पर Apple पृष्ठ से :
वैकल्पिक प्रोटोकॉल विधियों को @ रूपात्मक कीवर्ड का उपयोग करके वैकल्पिक के रूप में चिह्नित किया जा सकता है। @ रूपात्मक मोडल कीवर्ड के अनुरूप, डिफ़ॉल्ट व्यवहार के शब्दार्थ को औपचारिक रूप से निरूपित करने के लिए एक @required कीवर्ड है। आप अपने प्रोटोकॉल को विभाजन में @optional और @required का उपयोग कर सकते हैं जैसा कि आप फिट देखते हैं। यदि आप कोई कीवर्ड निर्दिष्ट नहीं करते हैं, तो डिफ़ॉल्ट @required है।
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
यदि किसी प्रोटोकॉल में एक विधि को वैकल्पिक के रूप में चिह्नित किया गया है, तो आपको यह जांचना होगा कि कोई वस्तु कॉल करने के प्रयास से पहले उस विधि को लागू करती है या नहीं।
एक उदाहरण के रूप में, पाई चार्ट दृश्य खंड शीर्षक विधि के लिए इस तरह परीक्षण कर सकता है:
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
RespondsToSelector: विधि एक चयनकर्ता का उपयोग करता है, जो संकलन के बाद एक विधि के लिए पहचानकर्ता को संदर्भित करता है। आप विधि के नाम को @selector () निर्देश और निर्दिष्ट करके सही पहचानकर्ता प्रदान कर सकते हैं।
यदि इस उदाहरण में डेटा स्रोत विधि को लागू करता है, तो शीर्षक का उपयोग किया जाता है; अन्यथा, शीर्षक शून्य रहता है।
@protocol MyProtocol <NSObject>
प्रोटोकॉल नियमों का सेट है। हम नीचे दिए गए उदाहरण के रूप में प्रोटोकॉल बना सकते हैं:
TestProtocols.h
@protocol TestProtocols <NSObject>
@optional
-(void)testMethodOptional;
@required // by default
-(void)testMethodRequired;
@end
कार्यान्वयन:
TestClass.h
#import "TestProtocols.h"
@interface TestClass : NSObject <TestProtocols>
@end
TestClass.m
#import "TestClass.h"
@implemenation TestClass
//optional to implement
-(void)testMethodOptional{
// Your Code
}
//required to implement
-(void)testMethodRequired{
// Your Code
}
@end
@optional
इसे वैकल्पिक बनाने के लिए अपनी विधि घोषणा से पहले कीवर्ड का उपयोग करें । इतना ही आसान!
// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
//...
@end
प्रोटोकॉल अमूर्त कक्षाओं के समान कार्य करते हैं, इसलिए @optional कीवर्ड उन विधियों को परिभाषित करता है जो कार्यान्वयन के लिए वैकल्पिक हैं।
तो, कोड में, someMethod1, someMethod2 और someMethod4 आवश्यक तरीके हैं (लागू किया जाना चाहिए)। someMethod3 वैकल्पिक है - यदि हमने इस पद्धति को लागू नहीं किया है, तो संकलक कोई चेतावनी नहीं देगा।
@protocol myPrtocol<NSObject>
-(void)someMethod1:(id)someArgument;
-(void)someMethod2:(id)someArugument;
@optional
-(void)someMethod3:(id)someArgument;
@required //by default
-(void)someMethod4:(id)someArgument;
@end
// sampleClass.m
@interface sampleClass : someSuperClass <myProtocol>
//...
@end