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?

jpm
sumber

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
Matt Gallagher
sumber
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.

Angin barat
sumber
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
Vikram Biwal
sumber
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
e.James
sumber
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
pengguna3540599
sumber