我可以使用未知类型的参数声明一个方法吗?

时间:2012-03-21 22:37:32

标签: iphone objective-c ios core-data

我正在构建一系列功能,这些功能将使我的核心数据调用更好,而不是那么臃肿。

假设我有一个看起来像这样的方法:

- (NSArray*)retrieveDataFrom:(NSString *) name where:(NSString *) where is:(NSString *) is {

   NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ = '%@')", where, is];

   return [self retrieveDataFrom:name withPredicate:predicate];
}

然后有时我想做这样的事情(例如):

[self retrieveDataFrom:@"table" where:@"id" is:int 2];

而不是:

[self retrieveDataFrom:@"table" where:@"id" is:@"2"];

有没有办法让方法接受一个参数而不知道它的类型?

4 个答案:

答案 0 :(得分:2)

不直接。您可以将输入声明为NSObject *,因此可以使用NSString *NSNumber *,但您仍然使用NSNumber难看的语法。

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]];

但是,很快会以Clang Language Extensions的形式提供更好的语法。

当这些降落时,你将能够写下这个:

[self retrieveDataFrom:@"table" where:@"id" is:@2];

目前,LLVM网站称这些将在llvm 4.0中。聪明的钱说这将是Xcode 4.4,但我怀疑Apple对LLVM网站上的声明感到满意。

答案 1 :(得分:1)

只需使用(id)代替(NSString *)

- (NSArray*)retrieveDataFrom:(NSString *) name where:(NSString *) where is:(id) is 

答案 2 :(得分:1)

没有。充其量,您可以使用id让它接受任何obj-c类型,但您不能让参数接受任何类型。唯一的例外是使用varargs,但即使在那里,方法也需要某种方式来了解在查看参数之前所期望的参数类型(例如printf - 样式方法使用格式字符串来确定类型论证将会是)。

如果您使用id,您的方法将类似于

- (NSArray *)retrieveDataFrom:(NSString *)name where:(NSString *)where is:(id)is;

您的用法将如下所示

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]];

或使用new objective-c literals

[self retrieveDataFrom:@"table" where:@"id" is:@2];

答案 3 :(得分:0)

使用(id)

- (NSArray*)retrieveDataFrom:(id) name where:(id) whereIs:(id)is {
  ...
}

或通过(NSArray *)

- (NSArray*)retrieveDataFrom:(NSArray*) params {
  ...
}