Làm thế nào để tạo một giao thức với các phương thức là tùy chọn?


133

Tôi nhận thấy các phương thức được đánh dấu tùy chọn trong một số giao thức được xác định trong SDK iPhone, chẳng hạn như UIActionSheetDelegategiao thức chẳng hạn.

Làm cách nào tôi có thể xác định một giao thức của riêng mình và đặt một vài phương thức làm tùy chọn?

Câu trả lời:


248

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

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

31

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.


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

1
Phải, như@protocol MyProtocol <NSObject>
Lawrence Kesteloot

Đây là một câu trả lời hoàn hảo!
smoothdvd

14

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

12

Sử dụng @optionaltừ 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

6

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.