我正在构建一系列功能,这些功能将使我的核心数据调用更好,而不是那么臃肿。
假设我有一个看起来像这样的方法:
- (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"];
有没有办法让方法接受一个参数而不知道它的类型?
答案 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]];
[self retrieveDataFrom:@"table" where:@"id" is:@2];
答案 3 :(得分:0)
使用(id)
- (NSArray*)retrieveDataFrom:(id) name where:(id) whereIs:(id)is {
...
}
或通过(NSArray *)
- (NSArray*)retrieveDataFrom:(NSArray*) params {
...
}