İsteğe bağlı yöntemlerle bir protokol nasıl oluşturulur?


133

IPhone SDK'da tanımlanan protokol gibi, örneğin UIActionSheetDelegateprotokol gibi isteğe bağlı olarak işaretlenmiş yöntemleri fark ettim .

Kendi protokolümü nasıl tanımlayabilirim ve birkaç yöntemi isteğe bağlı olarak nasıl ayarlayabilirim?

Yanıtlar:


248

" Resmi Protokoller " üzerindeki Apple sayfasından :

İsteğe bağlı Protokol yöntemleri, @optional anahtar sözcüğü kullanılarak isteğe bağlı olarak işaretlenebilir. @Optional modal anahtar sözcüğüne karşılık olarak, varsayılan davranışın anlambilimini resmen belirtmek için @ gerekli bir anahtar kelime vardır. Uygun gördüğünüz şekilde protokolünüzü bölümlere ayırmak için @optional ve @quired'i kullanabilirsiniz. Herhangi bir anahtar kelime belirtmezseniz, varsayılan değer @ zorunludur.

@protocol MyProtocol

- (void)requiredMethod;

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

@required
- (void)anotherRequiredMethod;

@end

4
şunu unutmayın: '' '@optional' '' 've' '' @required '' 'yönergesi, onu izleyen tüm yöntemler için geçerlidir.
Wayne

31

Protokoldeki bir yöntem isteğe bağlı olarak işaretlenirse, bir nesneyi çağırmaya çalışmadan önce o yöntemi uygulayıp uygulamadığını kontrol etmelisiniz.

Örnek olarak, pasta grafik görünümü aşağıdaki gibi segment başlığı yöntemini test edebilir:

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

ResponsesToSelector: yöntemi, derlemeden sonra bir yöntemin tanımlayıcısına başvuran bir seçici kullanır. @Selector () yönergesini kullanarak ve yöntemin adını belirterek doğru tanımlayıcıyı sağlayabilirsiniz.

Bu örnekteki veri kaynağı yöntemi uyguluyorsa başlık kullanılır; Aksi takdirde, başlık sıfır kalır.



1
Doğru, gibi@protocol MyProtocol <NSObject>
Lawrence Kesteloot

Bu mükemmel bir cevap!
smoothdvd

14

Protokoller bir dizi kuraldır. Aşağıdaki gibi protokoller oluşturabiliriz:

TestProtocols.h

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

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

Uygulama:

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

@optionalİsteğe bağlı yapmak için yöntem bildiriminizden önce anahtar kelimeyi kullanın . Bu kadar basit!

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

6

Protokoller soyut sınıflarla aynı şekilde hareket eder, bu nedenle @optional anahtar sözcüğü uygulama için isteğe bağlı olan yöntemleri tanımlar.

Bu nedenle, kodda someMethod1, someMethod2 ve someMethod4 gerekli yöntemlerdir (uygulanmalıdır). someMethod3 isteğe bağlıdır - bu yöntemi uygulamadıysak, derleyici herhangi bir uyarı atmaz.

@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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.