Câu trả lời:
Từ trang Apple trên " Giao thức chính thức ":
Các phương thức Giao thức tùy chọn có thể được đánh dấu là tùy chọn bằng từ khóa @optional. Tương ứng với từ khóa phương thức @optional, có một từ khóa @required để chính thức biểu thị ngữ nghĩa của hành vi mặc định. Bạn có thể sử dụng @optional và @required để phân vùng giao thức của bạn thành các phần khi bạn thấy phù hợp. Nếu bạn không chỉ định bất kỳ từ khóa nào, mặc định là @required.
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
Nếu một phương thức trong giao thức được đánh dấu là tùy chọn, bạn phải kiểm tra xem một đối tượng có thực hiện phương thức đó hay không trước khi thử gọi nó.
Ví dụ: chế độ xem biểu đồ hình tròn có thể kiểm tra phương thức tiêu đề phân đoạn như thế này:
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
Phương thức responssToSelector: sử dụng bộ chọn, tham chiếu đến mã định danh cho một phương thức sau khi biên dịch. Bạn có thể cung cấp định danh chính xác bằng cách sử dụng chỉ thị @selector () và chỉ định tên của phương thức.
Nếu nguồn dữ liệu trong ví dụ này thực hiện phương thức, tiêu đề được sử dụng; mặt khác, tiêu đề vẫn là con số không.
@protocol MyProtocol <NSObject>
Các giao thức được thiết lập các quy tắc. Chúng ta có thể tạo các giao thức như ví dụ dưới đây:
TestProt Protocol.h
@protocol TestProtocols <NSObject>
@optional
-(void)testMethodOptional;
@required // by default
-(void)testMethodRequired;
@end
Thực hiện:
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
Sử dụng @optional
từ khóa trước khi khai báo phương thức của bạn để làm cho nó tùy chọn. Đơn giản như vậy!
// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
//...
@end
Các giao thức hoạt động giống như các lớp trừu tượng, vì vậy từ khóa @optional định nghĩa các phương thức đó là tùy chọn để thực hiện.
Vì vậy, trong mã, someMethod1, someMethod2 và someMethod4 là các phương thức bắt buộc (phải được thực hiện). someMethod3 là tùy chọn - nếu chúng tôi không thực hiện phương pháp này, trình biên dịch sẽ không đưa ra bất kỳ cảnh báo nào.
@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