จะสร้างโปรโตคอลด้วยวิธีการที่เป็นทางเลือกได้อย่างไร?


135

ฉันสังเกตเห็นวิธีการทำเครื่องหมายว่าเป็นทางเลือกในหลายโปรโตคอลที่กำหนดไว้ใน iPhone SDK เช่นUIActionSheetDelegateโปรโตคอลเป็นต้น

ฉันจะกำหนดโปรโตคอลของตัวเองและตั้งค่าวิธีการบางอย่างเป็นทางเลือกได้อย่างไร

คำตอบ:


252

จากหน้า Apple เกี่ยวกับ " โปรโตคอลที่เป็นทางการ ":

วิธีการโปรโตคอลเสริมสามารถทำเครื่องหมายเป็นทางเลือกโดยใช้คีย์เวิร์ด @optional ตามคีย์เวิร์ดโมดอล @optional มีคีย์เวิร์ด @required เพื่อแสดงความหมายของพฤติกรรมเริ่มต้นอย่างเป็นทางการ คุณสามารถใช้ @optional และ @required เพื่อแบ่งโปรโตคอลของคุณออกเป็นส่วน ๆ ตามที่เห็นสมควร หากคุณไม่ระบุคีย์เวิร์ดใด ๆ ค่าเริ่มต้นคือ @required

@protocol MyProtocol

- (void)requiredMethod;

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

@required
- (void)anotherRequiredMethod;

@end

4
โปรดทราบว่า: คำสั่ง '' '@optional' '' และ '' '@required' '' ใช้กับวิธีการใด ๆ ที่เป็นไปตามนั้น
Wayne

31

หากเมธอดในโปรโตคอลถูกทำเครื่องหมายเป็นทางเลือกคุณต้องตรวจสอบว่าอ็อบเจ็กต์ใช้เมธอดนั้นหรือไม่ก่อนที่จะพยายามเรียกใช้

ตัวอย่างเช่นมุมมองแผนภูมิวงกลมอาจทดสอบวิธีการตั้งชื่อกลุ่มดังนี้:

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

responseToSelector: เมธอดใช้ตัวเลือกซึ่งอ้างถึงตัวระบุสำหรับวิธีการหลังการคอมไพล์ คุณสามารถระบุตัวระบุที่ถูกต้องโดยใช้คำสั่ง @selector () และระบุชื่อของวิธีการ

หากแหล่งข้อมูลในตัวอย่างนี้ใช้เมธอดจะใช้หัวเรื่อง มิฉะนั้นชื่อจะยังคงเป็นศูนย์


7
อย่าลืมขยาย NSObject ในโปรโตคอลของคุณเพื่อใช้
responseToSelector

1
ใช่แล้วเช่น@protocol MyProtocol <NSObject>
Lawrence Kesteloot

นี่คือคำตอบที่สมบูรณ์แบบ!
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.