2012-03-21 140 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

相關問題