2012-03-28 26 views
2

對於像C#或Java這樣的語言的泛型,你可以有一個工廠根據給定的類型返回一個結果?例如,你可以告訴工廠的方法返回:Objective-C - 工廠返回給定的類類型?

Book 
List<Book> 
Door 
List<Door> 

是否有可能與objective-c實現相同的目的? 我可以通過某種方式告訴generateObjects方法返回給我一些書嗎?

[self getDataFromWeb:@"SOME_URL" andReturnResultWithType:[Book class]]; 
// What about an array of Books? 

- (id)getDataFromWeb:(NSString*)url andReturnResultWithType:(Class)class 
{ 
    // Convert JSON and return result 
    // Mapping conversion is a class method under each contract (Book, Door, etc) 
} 

比方說,這是我的數據的一個合同

@interface Book : JSONContract 

@end 

@implementation Book 

+ (NSDictionary *)dataMapping 
{ 
    // returns an NSDictionary with key values 
    // key values define how JSON is converted to Objects 
} 

@end 

編輯:

修改的例子更清晰

+1

你真的想要做點什麼嗎?或者這只是一個關於語言特性的問題?因爲如果你想轉換JSON,爲此需要大量的第三方(現在是本機)庫,而字符串數組並不是最好的解決方案。 – jrturton 2012-03-28 05:38:43

+0

是否要將JSON中的所有'NSNumbers'轉換爲'NSStrings'? – Costique 2012-03-28 05:39:15

+0

返回值是第一組()。 – CodaFi 2012-03-28 05:39:43

回答

4

不,不可能說您的數組將包含字符串 但是,可以根據類定義甚至類名創建字符串。

的Objective-C像Java的「反思」的功能,它被稱爲「內省」

例如,您可以根據它的類名使用此代碼

NSString* myString = (NSString*)[[NSClassFromString(@"NSString") alloc] init]; 

NSClassFromString是創建一個對象這裏記載: https://developer.apple.com/library/mac/#documentation/cocoa/reference/foundation/miscellaneous/foundation_functions/reference/reference.html

如果你想編譯器檢查類型,你也可以直接使用Class對象,因爲這

Class stringClass = [NSString class]; 
NSString* myString = [[stringClass alloc] init]; 
+0

這仍然不能解決返回對象或該對象的數組的問題 – aryaxt 2012-03-28 05:54:37

+0

所以看起來不是這樣可以在Objective C上做到這一點。我最終創建了2個方法。 getDataFromWeb:andReturnResultWithType getDataFromWeb:andReturnResultWithArrayType – aryaxt 2012-03-28 20:07:13

1

是,NSArray的和NSMutableArray裏儲存的對象鍵入id,這意味着你可以把你想要的東西放在那裏,並將其返回給用戶。您只需檢查傳入的參數以分支您的邏輯,以生成要放入數組的對象。

你的評論表明這是爲了轉換JSON嗎?要轉換JSON,你必須有一系列的條件來檢查這個值是否看起來像一個數字,字符串等等。所以你可以添加一個條件,說如果類參數是NSString類,那麼就假設JSON值是一個字符串。

+0

有一個NSMutableArray沒有幫助,我的工廠需要知道什麼類型的對象填充到數組 – aryaxt 2012-03-28 05:46:20

+0

aryaxt,從技術上說是可能的做一個輸入類的對象。但是你的類必須有從JSON的init對象的公共接口。類似於'id obj = [[class alloc] initFromJSON:yourJSON];'getDataFromWeb'內部:'方法 – brigadir 2012-03-28 06:13:11