代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

Objective-C中的DRY元代码

  •  1
  • Dan Rosenstark  · 技术社区  · 14 年前

    我在Objective-C中遇到了这种情况:

    [aCoder encodeObject:self.control forKey:@"control"];
    [aCoder encodeObject:self.command forKey:@"command"];
    [aCoder encodeObject:self.channel forKey:@"channel"];
    [aCoder encodeObject:self.data1 forKey:@"data1"];
    

    在Ruby或Groovy中,我可以用块来实现这一点,还可以用一行代码而不是四行代码。我知道Objective-C有很多动态特性。如何提取这些代码?

    1 回复  |  直到 14 年前
        1
  •  5
  •   Alex Wayne    14 年前

    你可以用 performSelector:withObject:

    for (NSString *key in arrayOfKeys) {
      SEL aSelector = NSSelectorFromString(key);
      id anObject = [self performSelector:aSelector withObject:nil];
      [aCoder encodeObject:anObject forKey:key];
    }
    

    这就是如何在运行时动态调用一个方法,而只将该方法的名称作为字符串。这个 withObject: 参数是作为方法的单个参数传递的单个对象(如果需要)。

    如果它需要多个参数,或者需要一个非对象参数,那么您必须研究更复杂的 NSInvocation 我是哥们儿 NSMethodSignature . 不幸的是,它们不是很简单,但它们确实让你获得了一些令人印象深刻的活力,即使它们的使用是复杂和丑陋的。