Objective-C - Factory返回给定的类类型?

时间:2012-03-28 05:33:22

标签: objective-c generics

使用C#或Java等语言的泛型,您可以拥有一个根据给定类型返回结果的工厂?例如,您可以告诉工厂方法返回:

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

修改

修改示例更清晰

2 个答案:

答案 0 :(得分:4)

不,不可能说您的数组将包含String 但是,是的,可以根据类定义甚至类名创建String。

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

答案 1 :(得分:1)

是的,NSArray和NSMutableArray存储id类型的对象,这意味着您可以在其中放置任何内容并将其返回给用户。您只需检查传入的参数以分支您的逻辑,以生成您放入数组中的对象。

您的评论暗示这是为了转换JSON?要转换JSON,您必须有一系列条件来检查值是否类似于数字,字符串等。因此,您可以添加一个条件,指出如果类参数是NSString类,那么只需假设JSON值是一个字符串。