Objective-C:协议

Stu*_*Stu 2 protocols objective-c

我想要一个实例变量对象来采用协议.

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer *content <CocosNodeOpacity>;
}
Run Code Online (Sandbox Code Playgroud)

例如,我希望我的Layer对象采用,<CocosNodeOpacity>以便我可以获取方法

-(GLubyte) opacity;    //and
-(void) setOpacity: (GLubyte) opacity;
Run Code Online (Sandbox Code Playgroud)

免费.上面显示的语法无效.是否可以在不创建新实现文件和创建自定义对象的情况下实现此目的?谢谢.

Qui*_*lor 5

如果这些都是您创建的代码,那么最好的方法就是让Layer类本身采用协议而不是变量.

@interface Layer : NSObject <CocosNodeOpacity> { ... }
Run Code Online (Sandbox Code Playgroud)

这种方法的一个主要好处是编译器将检查您是否在编译时在协议中实现了所有必需的方法,这通常是您想要的.添加在同一个地方的方法为标准类实现的其余部分是比较容易理解(没有狩猎寻找到的神奇代码的来源),也比使用类别(加入通过不同的类别相同的方法,会导致不确定的行为)那么脆弱.作为一般规则,我只在必要时使用类别,例如向(闭源)第三方代码添加方法.

如果您不控制其来源Layer,则在声明您的ivar时可能需要使用它:

Layer<CocosNodeOpacity> *content;
Run Code Online (Sandbox Code Playgroud)

请注意,采用协议允许您使用类类型静态键入变量,并在方法不存在时获取编译警告.但是,您没有"免费"获取方法,因为您仍然需要实现它们.尽管如此,明智地使用协议和静态类型可以使您的代码比使用id所有类型的代码更加健壮和"快速失败" .不仅仅是采取简单的方法,你将受到赞扬.:-)

有关协议的一些细节(包括必需和可选方法),请参阅此SO答案.