3

我在 SCNRenderer 上写了一个类别,添加了一些相机实用程序方法。这些相同的方法对 SCNView 和 SCNLayer 同样有用。与此类别相关的所有三个类都符合 SCNSceneRenderer。是否可以编写一个不适用于特定类但适用于所有符合特定协议的类的类别?

4

2 回答 2

3

最简单的方法是编写一些采用 SCNSceneRenderer 对象的实用函数:

void ABCDoSomethingUseful(id<SCNSceneRenderer> renderer)
{
   //...
}

void ABCDoSomethingElseUseful(id<SCNSceneRenderer> renderer)
{
   //...
}

如果您想使用方法调用语法,或者希望能够覆盖子类中的实现,另一种选择是将方法实现为 NSObject 上的类别:

// This goes in a source file:

@interface NSObject (SCNSceneRendererConformance) <SCNSceneRenderer>
// Surpress compiler warnings about NSObject not responding to 
// SCNSceneRenderer's messages
@end

@implementation NSObject (MyCategory)

- (void)abc_doSomethingUseful
{
    //...
}


- (void)abc_doSomethingElseUseful
{
    //...
}

@end

然后在协议中公开它们:

// This goes in a header file:

@protocol MyProtocol <NSObject>
- (void)abc_doSomethingElseUseful;
- (void)abc_doSomethingUseful;
@end

并为每个符合 SCNSceneRenderer 的类添加一个仅接口类别,声明它也符合您的协议:

// This also goes in a header file:

@interface SCNLayer (MyProtocolConformance) <MyProtocol>
@end

@interface SCNView (MyProtocolConformance) <MyProtocol>
@end
于 2013-02-21T23:59:18.813 回答
0

我认为您不能在协议上添加类别,因为协议只定义接口而不是实现。而在类别中,我们也需要实施。

于 2013-02-21T22:27:27.940 回答