वैकल्पिक तरीकों के साथ एक प्रोटोकॉल कैसे बनाएं?


133

मैंने iPhone एसडीके में परिभाषित कई प्रोटोकॉल में वैकल्पिक तरीकों को देखा, जैसे कि UIActionSheetDelegateउदाहरण के लिए प्रोटोकॉल।

मैं अपने खुद के एक प्रोटोकॉल को कैसे परिभाषित कर सकता हूं, और कुछ तरीकों को वैकल्पिक के रूप में सेट कर सकता हूं?

जवाबों:


248

" औपचारिक प्रोटोकॉल " पर Apple पृष्ठ से :

वैकल्पिक प्रोटोकॉल विधियों को @ रूपात्मक कीवर्ड का उपयोग करके वैकल्पिक के रूप में चिह्नित किया जा सकता है। @ रूपात्मक मोडल कीवर्ड के अनुरूप, डिफ़ॉल्ट व्यवहार के शब्दार्थ को औपचारिक रूप से निरूपित करने के लिए एक @required कीवर्ड है। आप अपने प्रोटोकॉल को विभाजन में @optional और @required का उपयोग कर सकते हैं जैसा कि आप फिट देखते हैं। यदि आप कोई कीवर्ड निर्दिष्ट नहीं करते हैं, तो डिफ़ॉल्ट @required है।

@protocol MyProtocol

- (void)requiredMethod;

@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;

@required
- (void)anotherRequiredMethod;

@end

4
ध्यान दें कि: '' '' @ दत्तक '' '' और '' '' पदावनति '' '' '' निर्देशों का पालन किसी भी तरीके पर लागू होता है।
वेन

31

यदि किसी प्रोटोकॉल में एक विधि को वैकल्पिक के रूप में चिह्नित किया गया है, तो आपको यह जांचना होगा कि कोई वस्तु कॉल करने के प्रयास से पहले उस विधि को लागू करती है या नहीं।

एक उदाहरण के रूप में, पाई चार्ट दृश्य खंड शीर्षक विधि के लिए इस तरह परीक्षण कर सकता है:

NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
    thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}

RespondsToSelector: विधि एक चयनकर्ता का उपयोग करता है, जो संकलन के बाद एक विधि के लिए पहचानकर्ता को संदर्भित करता है। आप विधि के नाम को @selector () निर्देश और निर्दिष्ट करके सही पहचानकर्ता प्रदान कर सकते हैं।

यदि इस उदाहरण में डेटा स्रोत विधि को लागू करता है, तो शीर्षक का उपयोग किया जाता है; अन्यथा, शीर्षक शून्य रहता है।



1
ठीक है, जैसे@protocol MyProtocol <NSObject>
लॉरेंस केस्टेलूट

यह एक सही जवाब है!
smoothdvd

14

प्रोटोकॉल नियमों का सेट है। हम नीचे दिए गए उदाहरण के रूप में प्रोटोकॉल बना सकते हैं:

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

12

@optionalइसे वैकल्पिक बनाने के लिए अपनी विधि घोषणा से पहले कीवर्ड का उपयोग करें । इतना ही आसान!

// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
    //...
@end

6

प्रोटोकॉल अमूर्त कक्षाओं के समान कार्य करते हैं, इसलिए @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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.