Bagaimana cara membuat protokol dengan metode yang opsional?


133

Saya perhatikan metode yang ditandai opsional dalam beberapa protokol yang didefinisikan dalam iPhone SDK, seperti UIActionSheetDelegateprotokol misalnya.

Bagaimana saya bisa mendefinisikan protokol saya sendiri, dan menetapkan beberapa metode sebagai opsional?

Jawaban:


248

Dari halaman Apple pada " Protokol Resmi ":

Metode Protokol opsional dapat ditandai sebagai opsional menggunakan kata kunci @ opsional. Sesuai dengan kata kunci modal opsional, ada kata kunci yang diminta untuk menunjukkan secara formal semantik dari perilaku default. Anda dapat menggunakan @optional dan @required untuk mempartisi protokol Anda menjadi beberapa bagian sesuai keinginan Anda. Jika Anda tidak menentukan kata kunci apa pun, defaultnya adalah @required.

@protocol MyProtocol

- (void)requiredMethod;

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

@required
- (void)anotherRequiredMethod;

@end

4
perhatikan bahwa: Arahan '' '@ opsional' '' dan '' '@required' '' berlaku untuk semua metode yang mengikutinya.
Wayne

31

Jika suatu metode dalam protokol ditandai sebagai opsional, Anda harus memeriksa apakah suatu objek mengimplementasikan metode itu sebelum mencoba memanggilnya.

Sebagai contoh, tampilan diagram lingkaran mungkin menguji metode judul segmen seperti ini:

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

Metode ResponssToSelector: menggunakan pemilih, yang merujuk ke pengidentifikasi untuk metode setelah kompilasi. Anda dapat memberikan pengidentifikasi yang benar dengan menggunakan petunjuk @selector () dan menentukan nama metode.

Jika sumber data dalam contoh ini mengimplementasikan metode, judul digunakan; jika tidak, judulnya tetap nol.


7
Pastikan untuk memperpanjang NSObject dalam protokol Anda untuk menggunakan respondsToSelector
Fracdroid

1
Benar, seperti@protocol MyProtocol <NSObject>
Lawrence Kesteloot

Ini jawaban yang sempurna!
smoothdvd

14

Protokol adalah seperangkat aturan. Kita dapat membuat protokol seperti contoh di bawah ini:

TestProtocols.h

@protocol TestProtocols <NSObject>
    @optional
    -(void)testMethodOptional;

    @required  // by default
    -(void)testMethodRequired;
@end

Penerapan:

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

Gunakan @optionalkata kunci sebelum deklarasi metode Anda untuk menjadikannya opsional. Sederhana seperti itu!

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

6

Protokol bertindak sama dengan kelas abstrak, sehingga kata kunci @ opsional menentukan metode yang opsional untuk implementasi.

Jadi, dalam kode, someMethod1, someMethod2 dan someMethod4 adalah metode yang diperlukan (harus diimplementasikan). someMethod3 adalah opsional - jika kami tidak menerapkan metode ini, kompiler tidak akan memberikan peringatan apa pun.

@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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.