2012-03-21 89 views
2

我正在构建一堆功能,这些功能将使我的核心数据调用更好一点,而不是太臃肿。我可以声明一个带有未知类型参数的方法吗?

可以说,我有一个看起来像这样的方法:

- (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"]; 

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

回答

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中,但我怀疑苹果是否支持LLVM网站上的声明。

+0

我几乎等不及了。 – BoltClock 2012-03-21 22:43:44

+0

同上。我只是希望他们对于计划的[NSNull null]有一个@null。 – 2012-03-21 22:44:44

+0

这就是我一直在寻找的东西。 Beeing NS类型对我来说已经足够了。从那里我可以设置从NSNumber到int等的转换。我也可以让它接受一个NSDictionary,并在那里存储多个值。我想我昨天晚上想到这个太累了。感谢真棒的回答! :) – Filibustr 2012-03-22 08:52:00

1

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

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

号在最好的情况,你可以让它通过id接受任何OBJ-C型,但你不能有一个参数接受任何类型。唯一的例外是使用可变参数,但即使在那里,该方法也需要某种方式来知道在查看参数之前需要什么类型的参数(例如printf -style方法使用格式字符串来确定参数的类型是什么将)。

如果使用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]; 
+0

我想我也可以做到这一点。与使用id和NSObject(或它们是否相同?)有什么不同? – Filibustr 2012-03-22 08:55:26

+0

只需要注意,NSObject是大多数其他类继承并从中分类的根类。 id只是一个指向对象的指针。Objective-C是动态类型化的,因​​此在运行时动态检查id类型的对象,以查看它们是否支持您传递它们的任何消息。设置一个类型允许编译器在运行之前为你检查一些东西。实际上,它们是相似的,但是,两者之间有很大的差异。 – Matias 2012-03-22 12:26:45

+0

@Filibustr:'NSObject'是最常见的根类,但第二个叫做'NSProxy',如果你愿意,你可以创建其他类。 'id'是通用的“任何对象”指针。 – 2012-03-22 20:22:16

0

使用(ID)

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

或通过(NSArray的*)

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

是的,它只是在我看来,我可以使用NSArray或NSDict来代替。今晚我会尝试所有这些答案。 :) – Filibustr 2012-03-22 08:56:16

相关问题