2014-02-18 2 views
2

Я понимаю, как сделать класс соответствовать нескольким протоколам, но где и как я могу определить протокол, который будет вызываться несколькими классами, т.е.Один протокол, используемый многими классами

_delegate.doStuff 

может появиться в несколько классов.

ответ

4

В Xcode,

File-> New File-> Objective-c Protocol

@protocol myProtocolName 

- (void) doStuff; 

@end 

затем в классах вы хотите реализовать этот протокол

... 
#import "myProtocol.h" 
@interface aClass <myProtocolName> 
... 

Вы можете добавить это к любому количеству классов.

+2

Чтобы уточнить, у вас просто есть файл .h с протоколом. Нет .m-файла. – rmaddy

+0

О да, конечно, но если вы должны были создать новый «Objective-c protocol» в меню файла в Xcode, он будет генерировать только нужные вам файлы, т. Е. Только заголовок (.h), но спасибо за указание на то, что :) –

2

Просто введите новое определение протокола - обычно в файле #h. В Xcode это находится под файлом, New, «Objective-C Protocol».

Вот небольшой пример двух протоколов, а также некоторые необходимые и необязательные методы и свойства. Обратите внимание, что свойства в протоколах должны быть быть синтезированы в классах, соответствующих протоколу, если свойство @required (@required является значением по умолчанию, поэтому его можно оставить без использования, если нет секции @optional).

// AnimalMinionType.h 
@protocol AnimalMinionType <NSObject> 
@required 
@property (nonatomic, getter = isHerbivore) BOOL herbivore; 
- (NSString *)genus; 
- (NSString *)species; 
- (NSString *)nickname; 
- (void)doPet; 
@optional 
- (NSString *)subspecies; 
@end 

// IdiotType.h 
@protocol IdiotType <NSObject> 
@optional 
- (void)pet:(id<AnimalMinionType>)pet didScratch:(BOOL)scratchy; 
@end 

// FluffyCat.h 
@interface FluffyCat : NSObject <AnimalType> 
@end 

// FluffyCat.m 
@implementation FluffyCat 
@synthesize herbivore; 
- (NSString *)genus { return @"felis"; } 
- (NSString *)species { return @"catus"; } 
- (NSString *)nickname { return @"damn cat"; } 
- (void)doPet:(id<IdiotType>)anyoneOrAnything 
{ 
    NSLog(@"meow"); 
    if ([anyoneOrAnything respondsToSelector:@selector(pet:didScratch:)]) 
     [anyoneOrAnything pet:self didScratch:@YES]; 
} 
@end 

// Owner.h 
@interface Owner : NSObject <IdiotType> 
@property id<AnimalMinionType> housepet; 
@end 

// Owner.m 
@implementation Owner 
- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.housepet = [FluffyCat new]; 
     [self.housepet setHerbivore:@NO]; 
    } 
    return self; 
} 

- (NSString *)ohACuteAnimalWhatKindIsIt 
{ 
    return [NSString stringWithFormat:@"%@ %@",[self.housepet genus], [self.housepet species]]; 
} 

- (void)haveALongDayAtWorkAndJustNeedAFriend 
{ 
    if (self.housepet) [self.housepet doPet:self]; 
} 

- (void)pet:(id<AnimalMinionType>)pet didScratch:(BOOL)scratchy 
{ 
    if ((scratchy) && (pet == self.housepet)) 
    { 
     NSLog(@"I HATE THAT %@", [[self.housepet nickname] uppercaseString]); 
     self.housepet = nil; 
    } 
} 
@end 

Я надеюсь, что это поможет. :-)

Смежные вопросы