一种协议,由许多类使用

时间:2014-02-18 00:52:39

标签: ios objective-c protocols

我理解如何使一个类符合几个协议,但是在哪里以及如何定义一个将被几个类调用的协议,即

_delegate.doStuff

可能出现在几个班级中。

2 个答案:

答案 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

我希望有所帮助。 : - )