ฉันสังเกตเห็นวิธีการทำเครื่องหมายว่าเป็นทางเลือกในหลายโปรโตคอลที่กำหนดไว้ใน iPhone SDK เช่นUIActionSheetDelegate
โปรโตคอลเป็นต้น
ฉันจะกำหนดโปรโตคอลของตัวเองและตั้งค่าวิธีการบางอย่างเป็นทางเลือกได้อย่างไร
ฉันสังเกตเห็นวิธีการทำเครื่องหมายว่าเป็นทางเลือกในหลายโปรโตคอลที่กำหนดไว้ใน iPhone SDK เช่นUIActionSheetDelegate
โปรโตคอลเป็นต้น
ฉันจะกำหนดโปรโตคอลของตัวเองและตั้งค่าวิธีการบางอย่างเป็นทางเลือกได้อย่างไร
คำตอบ:
จากหน้า Apple เกี่ยวกับ " โปรโตคอลที่เป็นทางการ ":
วิธีการโปรโตคอลเสริมสามารถทำเครื่องหมายเป็นทางเลือกโดยใช้คีย์เวิร์ด @optional ตามคีย์เวิร์ดโมดอล @optional มีคีย์เวิร์ด @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];
}
responseToSelector: เมธอดใช้ตัวเลือกซึ่งอ้างถึงตัวระบุสำหรับวิธีการหลังการคอมไพล์ คุณสามารถระบุตัวระบุที่ถูกต้องโดยใช้คำสั่ง @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