Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Objective-C - Factory to return a given class type?

With generics on languages like C# or Java, you can have a factory that returns a result depending on the given type? For example you can tell the factory method to return:

Book
List<Book>
Door
List<Door>

Is it possible to achieve the same thing with objective-c? Can I somehow tell generateObjects method to return me an array of books?

[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)
} 

Let's say this is one of my data contracts

@interface Book : JSONContract

@end

@implementation Book

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

@end

EDIT:

Modified the examples to be more clear

like image 387
aryaxt Avatar asked Mar 18 '26 00:03

aryaxt


1 Answers

No, it is no possible to say that your array will contain String But, Yes, it is possible to create String based on a Class definition or even a class name.

Objective-C as "reflection" capabilities like Java, it is called "introspection"

For example, you can create an object based on its class name using this code

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

NSClassFromString is documented here : https://developer.apple.com/library/mac/#documentation/cocoa/reference/foundation/miscellaneous/foundation_functions/reference/reference.html

If you want the compiler to check types for you, you can also directly use the Class object, as this

Class stringClass = [NSString class];
NSString* myString = [[stringClass alloc] init];
like image 163
Sébastien Stormacq Avatar answered Mar 19 '26 12:03

Sébastien Stormacq