4

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

我想要这样的东西:

-(void)doSomethingWithType:(TYPE)type {

//do something

}

并像这样执行:

[self doSomethingWithType:int];

或者

[self doSomethingWithType:BOOL];

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

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

谢谢!

4

3 回答 3

7

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

-(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 等。仅限 Objective-C 类。希望,它会有所帮助。对不起,如果这不是你要找的。

于 2013-06-13T20:08:57.763 回答
6

类型在 C 或 Objective-C 中不是一流的,因此您不能将它们传递给函数。

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 前的“#”表示“以此为字符串”。请注意,编写宏时有很多陷阱;我强烈建议您先在谷歌上搜索一下它们的良好入门。

于 2013-06-13T17:53:04.573 回答
1
  1. Apple 框架通常使用@encode. 苹果定义的格式甚至可以描述原始类型的数组。优点 - 相当标准。缺点 - 您必须在调用方法之前添加编码类型的代码并将解码添加到您的方法中。

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

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

然而,没有一个解决方案是完美的。如果您需要这样的东西,在大多数情况下,它只是由非常糟糕的设计引起的。

于 2013-06-13T19:57:22.443 回答