代码之家  ›  专栏  ›  技术社区  ›  DaPhil

减少目标C中的重复代码

  •  -1
  • DaPhil  · 技术社区  · 10 年前

    我有一个定义了一些财产的协议。我的文档类符合此协议。对于我喜欢使用这些变量的任何其他类,我将文档类设置为委托,以便可以在其中编写getter/setter,如下所示:

    - (NSArray *)array
    {
        if (self.delegate) {
            return self.delegate.array;
        } else {
            return [[NSArray alloc] init];
        }
    }
    

    这样,我就有一个地方来存储我的东西(没有不必要的副本),我只需要询问我的代理,直到链到达文档类。问题:如果我在协议中添加了一个新变量,并且必须在所有地方添加getter/setter!既然它们都是一样的,我就想办法 交外办理 这段重复的代码。

    2 回复  |  直到 10 年前
        1
  •  1
  •   matt    10 年前

    将方法转发给代理的问题的一般解决方案称为“消息转发”(毫不奇怪),并在此处进行了详细说明:

    https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html

    当你读到那一页时,你会发现,那里正在解决的问题与你提出的问题惊人地相似。

        2
  •  1
  •   Yas Tabasam Denys    10 年前

    黑客会创建一个 category 在…上 NSObject 并将其包含在您需要的位置。在该类别中,

    • 您可以检查实例是否响应 delegate 属性getter选择器,
    • 如果是,则动态执行getter以获取委托实例。
    • 然后动态执行属性的getter选择器以获取其值。

    下面是代码 NSObject+Extentions.m 应该看起来像:

    @implementation NSObject (Extentions)
    
    - (NSArray *)array {
        if ([self respondsToSelector:@selector(setDelegate:)]) {
            id delegate = [self performSelector:@selector(delegate)];
            return [delegate performSelector:@selector(array)];
        } else {
            return [[NSArray alloc] init];
        }
    }
    
    @end