【问题标题】:How to dynamically prepare a selector for matching with respondsToSelector如何动态准备选择器以与respondsToSelector匹配
【发布时间】:2013-10-12 11:49:23
【问题描述】:

给定一个具有如下属性的类:

@property(nonatomic,retain) NSString* un_conventional;

我尝试形成这样的选择器:

SEL setterMethod =
  NSSelectorFromString(
    [NSString stringWithFormat:@"set%@", [key capitalizedString]]
  );
if ([customer respondsToSelector:setterMethod]) {
    //do something
}

PS:理所当然地认为key是一个值为un_conventional的变量

问题似乎是这与正确的setter方法不匹配,因为capitalizedString导致setterMethod被命名为setUn_Conventional而不是setUn_conventional......字母“c”也是大写的!

那么,对于如何为这种情况动态准备选择器以生成名为 setUn_conventional 的选择器并可以通过 respondsToSelector 进行匹配,是否有人有任何建议?

【问题讨论】:

  • 我至少能找到一个反对票的理由吗?
  • 可能是因为这种元编程是一种反模式,并且表明存在严重的潜在架构问题(不是我,不过,我会尽快回答这个问题)。或者,可能是因为该人的意思是建议您可能应该研究 Key-Value Coding。

标签: ios objective-c nsstring respondstoselector


【解决方案1】:
SEL setterMethod = NSSelectorFromString(
    [NSString stringWithFormat:
          @"set%@%@",
          [[key substringToIndex:1]uppercaseString],
          [key substringFromIndex:1]
    ]
);

如果您能保证密钥至少有 1 个字符长,就可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多