2012-03-28 25 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