我理解如何使一个类符合几个协议,但是在哪里以及如何定义一个将被几个类调用的协议,即
_delegate.doStuff
可能出现在几个班级中。
答案 0 :(得分:4)
在xcode中,
File-> New File-> Objective-c Protocol
@protocol myProtocolName
- (void) doStuff;
@end
然后在你想要实现这个协议的类中
...
#import "myProtocol.h"
@interface aClass <myProtocolName>
...
您可以将其添加到任意数量的类中。
答案 1 :(得分:2)
只需创建一个新的协议定义 - 通常在一个很好的#import'able .h文件中。在Xcode中,这是在File,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
我希望有所帮助。 : - )