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

Iphone 我可以用未知类型的参数声明方法吗?,iphone,objective-c,ios,core-data,Iphone,Objective C,Ios,Core Data,我正在构建一系列函数,这些函数将使我的核心数据调用变得更好,而且不会过于臃肿 假设我有一个如下所示的方法: - (NSArray*)retrieveDataFrom:(NSString *) name where:(NSString *) where is:(NSString *) is { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ = '%@')", where, is]; return [s

我正在构建一系列函数,这些函数将使我的核心数据调用变得更好,而且不会过于臃肿

假设我有一个如下所示的方法:

- (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:@"2"];
有没有一种方法可以让方法在不知道参数类型的情况下接受参数?

只需使用
(id)
而不是
(NSString*)

只需使用
(id)
而不是
(NSString*)


不可以。您最多可以使用
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]];
您的用法将如下所示

- (NSArray *)retrieveDataFrom:(NSString *)name where:(NSString *)where is:(id)is;
[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]];
或者用


不可以。您最多可以使用
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]];
您的用法将如下所示

- (NSArray *)retrieveDataFrom:(NSString *)name where:(NSString *)where is:(id)is;
[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]];
或者用


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

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]];
然而,更好的语法很快就会以语法的形式出现

当这些数据到达时,您将能够编写以下内容:

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

目前,LLVM网站称这些将在LLVM4.0中实现。智能货币表示这将出现在Xcode 4.4中,但我怀疑苹果是否有义务在LLVM网站上发表声明。

不是直接的。您可以将输入声明为
NSObject*
,这样它就可以使用
NSString*
NSNumber*
,但仍然无法使用
NSNumber
难看的语法

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]];
然而,更好的语法很快就会以语法的形式出现

当这些数据到达时,您将能够编写以下内容:

[self retrieveDataFrom:@"table" where:@"id" is:@2];
目前,LLVM网站称这些将在LLVM4.0中实现。智能货币表示这将出现在Xcode 4.4中,但我怀疑苹果是否有义务在LLVM网站上发表声明。

使用(id)

或通行证(NSArray*)

使用(id)

或通行证(NSArray*)


同上。我只是希望他们为[NSNull-null]计划了一个@null。这就是我想要的。对我来说,穿NS型就足够了。从那里我可以设置从NSNumber到int等的转换。我还可以让它接受NSDictionary,并在其中存储多个值。我想我昨晚太累了,想不起来了。谢谢你的回答!:)同上。我只是希望他们为[NSNull-null]计划了一个@null。这就是我想要的。对我来说,穿NS型就足够了。从那里我可以设置从NSNumber到int等的转换。我还可以让它接受NSDictionary,并在其中存储多个值。我想我昨晚太累了,想不起来了。谢谢你的回答!:)我想我也能做到。使用id和NSObject(或者它们是相同的?)有什么区别?请注意,NSObject是大多数其他类继承的根类,并且是从中派生的。id只是指向对象的指针。Objective-C是动态类型的,因此在运行时会动态检查id类型的对象,以查看它们是否支持您传递给它们的任何消息。设置类型允许编译器在运行时之前为您检查内容。实际上,它们是相似的,但是,两者之间有很大的区别。@Filibustr:
NSObject
是最常见的根类,但是还有第二个名为
NSProxy
,如果需要,您可以创建其他根类
id
是通用的“任意对象”指针。我想我也可以这样做。使用id和NSObject(或者它们是相同的?)有什么区别?请注意,NSObject是大多数其他类继承的根类,并且是从中派生的。id只是指向对象的指针。Objective-C是动态类型的,因此在运行时会动态检查id类型的对象,以查看它们是否支持您传递给它们的任何消息。设置类型允许编译器在运行时之前为您检查内容。实际上,它们是相似的,但是,两者之间有很大的区别。@Filibustr:
NSObject
是最常见的根类,但是还有第二个名为
NSProxy
,如果需要,您可以创建其他根类
id
是通用的“任意对象”指针。是的,我刚想到我可以用NSArray或NSDict来代替。今晚我将尝试所有这些答案。:)是的,我突然想到我可以用NSArray或NSDict来代替。今晚我将尝试所有这些答案。:)