I’d like an instance variable object to adopt a protocol.
@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
Layer *content <CocosNodeOpacity>;
}
For example I’d like my Layer object to adopt the <CocosNodeOpacity> so that I can get the methods
-(GLubyte) opacity; //and
-(void) setOpacity: (GLubyte) opacity;
for free. The syntax shown above is invalid. Is it possible to achieve this without creating a new implementation file and creating a custom object? Thanks.
If these are all code you created, the best way to do this is probably to make the
Layerclass itself adopt the protocol, rather than the variable.A key benefit to this approach is that the compiler will check whether you’ve implemented all required methods in the protocol at compile time, which is generally what you want. Adding the methods in same place as the rest of the standard class implementation is easier to understand (no hunting to find where the magical code came from) and less fragile than using categories (adding the same method via different categories can result in undefined behavior). As a general rule, I only use categories when I have to, such as adding methods to (closed-source) third-party code.
If you don’t control the source of
Layer, you may have to use this instead when you declare your ivar:Note that adopting a protocol allows you to statically type variables with a class type and get compile warnings if the methods aren’t present. However, you don’t get the methods “for free”, since you still have to implement them. Still, judicious use of protocols and static typing can make your code more robust and “fail-fast” than using
idas the type for everything. You are to be commended for not just taking the easy way out. 🙂For some details about protocols (including required and optional methods) see this SO answer.