【问题标题】:How to Make a Dynamically Named Method Parameter? [duplicate]如何制作动态命名的方法参数? [复制]
【发布时间】:2012-10-11 02:49:41
【问题描述】:

可能重复:
Objective C Equivalent of PHP’s “Variable Variables”

我在 Objective C 中创建了一个方法,如下所示:

- (void) startBuildingXArray: (NSMutableArray *) arrayName:(int) senderID;

但是,这是棘手的部分。特定的 arrayName 参数取决于 senderID 是什么。具体来说,每个 arrayName 的末尾都有一个与此方法中的 senderID 匹配的数字(即 array1、array2 等)。有没有办法将整数作为参数动态添加到数组名称的末尾?还是完全不同的更好的方法来产生相同的结果?

换句话说,我想创造的是这样一种情况:

- (void) startBuildingXArray: (NSMutableArray *) arrayName+(senderID):(int) senderID;

当然,这绝不是有效的代码,我只是想证明我想要发生的事情。任何人都可以提出任何解决方案吗?

【问题讨论】:

标签: objective-c methods parameters


【解决方案1】:

你很幸运:Objective-C 是一门动态语言,所以你可以在运行时创建选择器(方法名),并为它们添加相应的实现函数。假设您已经实现了这些方法(例如,从 startBuildingXArray:arrayName1:...arrayName9: 等),并且您正在寻找一种根据整数 ID 调用它们的方法:

- (void)callMethodWithParam:(NSMutableArray *)parm ID:(int)ident
{
    // get the selector name and the selector
    char zelektor[128];
    snprintf(zelektor, sizeof(zelektor), "startBuildingXArray:arrayName%d:", ident);
    SEL realSel = sel_getUid(zelektor);

    // Alternatively you can use Foundation as well:
    /*
    NSString *zelektor = [NSString stringWithFormat:@"startBuildingXArray:arrayName%d:", ident];
    SEL realSel = NSSelectorFromString(zelektor);
     */

    // Grab a function pointer to the implementation corresponding to the selector
    IMP imp = class_getInstanceMethod([self class], realSel);

    // and call the function pointer just obtained
    imp(self, realSel, parm, ident);
}

如果您想批量创建具有这样名称的方法,您可以使用类似的方法,但改用 class_addMethod() Objective-C runtime function

但是,这是一个 hack。我宁愿建议你使用一个函数并根据传入的整数标识符来实现它的任务。

【讨论】:

    猜你喜欢
    • 2015-09-23
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2020-10-31
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多