2008-11-26 34 views

Trả lời

226

Từ trang Apple trên "Formal Protocols":

Nghị định thư phương pháp có thể được đánh dấu là không bắt buộc sử dụng từ khóa @optional. Tương ứng với @optional modal từ khóa, có một từ khóa được yêu cầu để 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 như bạn thấy phù hợp. Nếu bạn không chỉ định bất kỳ từ khóa nào , thì mặc định là @required.

@protocol MyProtocol 

- (void)requiredMethod; 

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

@required 
- (void)anotherRequiredMethod; 

@end 
+1

lưu ý rằng: Chỉ thị '' '@optional' '' và '' '@required' '' áp dụng cho bất kỳ phương pháp nào theo dõi nó. – Wayne

11

Sử dụng từ khóa @optional trước khi khai báo phương pháp của bạn để tùy chọn. Đơn giản như thế!

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

Giao thức hoạt động tương tự như lớp trừu tượng, vì vậy từ khóa @optional xác định những phương pháp mà 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 triển khai). someMethod3 là tùy chọn - nếu chúng ta không thực hiện phương thức này, trình biên dịch sẽ không ném 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 
23

Nếu 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 đối tượng có triển khai phương thức đó trước khi thử gọi phương thức đó hay không.

Như một ví dụ, bảng xếp hạng xem chiếc bánh có thể kiểm tra đối với phương pháp tiêu đề phân khúc như thế này:

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

Các respondsToSelector: Phương pháp sử dụng một bộ chọn, trong đó đề cập đến định danh cho một phương pháp sau khi biên dịch. Bạn có thể cung cấp mã đị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 pháp, tiêu đề được sử dụng; nếu không, tiêu đề vẫn là không.

+5

Đảm bảo mở rộng NSObject trong giao thức của bạn để sử dụng respondsToSelector – Fracdroid

8

Giao thức được đặt theo quy tắc. Chúng ta có thể tạo ra các giao thức như sau Ví dụ:

TestProtocols.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 
Các vấn đề liên quan