Objective C Type作为参数

时间:2013-06-13 17:49:11

标签: objective-c

好的,我在调用方法或其他东西时不会问如何获取参数。

我想要这样的事情:

-(void)doSomethingWithType:(TYPE)type {

//do something

}

并执行如下:

[self doSomethingWithType:int];

[self doSomethingWithType:BOOL];

如何创建具有类型作为参数的方法/函数的参数?我的意思是任何类型.. :))

我不想创建一个int参数,我想创建一个int类型参数,在这里您将目标c类型作为参数而不是值或变量写入:)

谢谢!

3 个答案:

答案 0 :(得分:6)

我不确定我是否理解你的意图,但是Objective-C有一个“Class”类。

-(void)doSomethingWithType:(Class)type {
    //do something
    //for example, create an instance of this type:
    id object = [[type alloc] init];
}

你可以这样称呼它:

[objectOfMyClass doSomethingWithType: [SomeObjectiveCType class]];

但它不适用于原始类型。我的意思是BOOL,int,float等。目标-C类。 希望,它会有所帮助。对不起,如果这不是你想要的。

答案 1 :(得分:5)

C或Objective-C中的类型不是first-class,因此您无法将它们传递给函数。

Objective-C代码通常将它们表示为char *,类似@encode。所以,例如:

- (void)doSomethingWithType:(char *)encodedType {
    NSLog(@"Got type %s", encodedType);
}

[self doSomethingWithType:@encode(int)];

您可以查看Apple Docs@encode的内容。

另一种方法是使用宏(而不是方法),它可以将任意源文本作为参数来创建新代码。例如:

#define MY_MACRO(SYMBOL, TYPE) DoSomething(#SYMBOL, (TYPE *)&SYMBOL)

您使用的是:

MY_MACRO(foo, int);

这相当于代码:

DoSomething("foo", (int *)&foo);

宏中SYMBOL之前的“#”表示“从中创建一个字符串”。请注意,在编写宏时,会有批次的陷阱;我强烈建议先在谷歌上搜索一下好的入门书。

答案 2 :(得分:0)

  1. Apple框架通常使用@encode。 apple定义的格式甚至可以描述基本类型的数组。优点 - 相当标准。缺点 - 您必须在调用方法之前添加对该类型进行编码的代码,并将解码添加到您的方法中。

  2. 为您需要的每种类型提供单独的方法。缺点 - 很多方法。优点 - 易于阅读的代码,易于使用的代码。

  3. 宏而不是方法。宏可以采用任何参数,包括类型名称。缺点 - 代码难以阅读,优点 - 简短代码,易于使用的代码。

  4. 然而,没有一种解决方案是完美的。如果你需要这样的东西,在大多数情况下,它只是由非常糟糕的设计造成的。