我可以在Objective-C中将协议作为类变量吗?

时间:2011-06-28 18:54:12

标签: objective-c protocols

我是Objective C的新手。我正在尝试使用协议,因为我会使用Java中的接口,但我不知道它是如何,甚至是否适合这项工作。我在Protocol.h中定义了一个协议:

@protocol SomeProtocol
- (void)someMethod;
@end

现在,在另一个类中,我需要一个具有someMethod

的变量
#import "Protocol.h"
@interface OtherClass:NSObject {
    SomeProtocol objWithSomeMethod;
}
@end

当然“SomeProtocol objWithSomeMethod”给了我一个错误。那么有没有办法声明一个对象,无论其类型如何,都符合这个协议?

3 个答案:

答案 0 :(得分:4)

是的,请使用尖括号。您可以声明一个实例变量以符合这样的协议:

id<SomeProtocol> objWithSomeMethod;

如果您希望它符合多个协议,请使用逗号分隔它们:

id<SomeProtocol, SomeOtherProtocol> objWithSomeMethod;

您也可以用相同的方式声明变量或参数。

答案 1 :(得分:4)

尖括号将对象限定为实现协议。在您的示例中,写下

#import "Protocol.h"
@interface OtherClass : NSObject {
    id<SomeProtocol> objWithSomeMethod;
}
@end

如果要声明类实现接口,则使用相同的表示法,基本上:

@interface MyProtocolClass : NSObject <SomeProtocol> {
    // ...
}
@end

答案 2 :(得分:-1)

你应该用他的类型声明你的实例变量,然后是&lt;&gt;里面的协议列表。最后是变量名。所以在你的情况下,它将是:

#import "Protocol.h"
@interface OtherClass:NSObject {
    id <SomeProtocol> objWithSomeMethod;
}
@end