Yanıtlar:
" 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
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.
@protocol MyProtocol <NSObject>
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
@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
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