好的,我在调用方法或其他东西时不会问如何获取参数。
我想要这样的事情:
-(void)doSomethingWithType:(TYPE)type {
//do something
}
并执行如下:
[self doSomethingWithType:int];
或
[self doSomethingWithType:BOOL];
如何创建具有类型作为参数的方法/函数的参数?我的意思是任何类型.. :))
我不想创建一个int参数,我想创建一个int类型参数,在这里您将目标c类型作为参数而不是值或变量写入:)
谢谢!
答案 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)
Apple框架通常使用@encode
。 apple定义的格式甚至可以描述基本类型的数组。优点 - 相当标准。缺点 - 您必须在调用方法之前添加对该类型进行编码的代码,并将解码添加到您的方法中。
为您需要的每种类型提供单独的方法。缺点 - 很多方法。优点 - 易于阅读的代码,易于使用的代码。
宏而不是方法。宏可以采用任何参数,包括类型名称。缺点 - 代码难以阅读,优点 - 简短代码,易于使用的代码。
然而,没有一种解决方案是完美的。如果你需要这样的东西,在大多数情况下,它只是由非常糟糕的设计造成的。