Я знаю, что это можно сделать на многих языках, но я не понимаю, как это сделать с помощью Objective-C.Я читал о синглетах, но поскольку они предназначены для создания экземпляра только один раз, они не удовлетворяют эту потребность.
Таким образом, этот класс можно назвать так:
MyClass* obj1 = [[MyClass alloc] initWithKey:@"oneKey"];
NSString* lib = obj1.lib;
или
int id = [MyClass idForKey:@"anotherKey"];
Я пробовал этот код, но я уверен, что он действительно плохой, но я не вижу, как этого добиться:
.h file
@interface MyClass : NSObject {
NSString* key;
}
@property(nonatomic, retain) NSString* key;
@property(nonatomic, readonly) int id;
@property(nonatomic, readonly) NSString* lib;
@property(nonatomic, readonly) int value;
+ (id) classWithKey:(NSString*)theKey;
@end
.m файл
#import "MyClass.h"
@interface MyClass.h (Private)
-(id)initWithKey:(NSString*)theKey;
@end
@implementation MyClass
@synthesize key;
static NSMutableDictionary* vars = nil;
-(id)init
{
if (!(self = [super init])) return nil;
self.key = nil;
[MyClass initVars];
return self;
}
-(id)initWithKey:(NSString*)theKey
{
if (!(self = [super init])) return nil;
self.key = theKey;
[MyClass initVars];
return self;
}
+ (id) classWithKey:(NSString*) theKey
{
return [[[MyClass alloc] initWithKey:theKey] autorelease];
}
+(void)initVars
{
if (vars != nil) return;
#define mNum(x) [NSNumber numberWithInt:x]
#define k0 @"id"
#define k1 @"lib"
#define k2 @"val"
vars = [NSMutableDictionary dictionary];
[vars setObject:[NSDictionary dictionaryWithObjectsAndKeys:mNum(5), k0, @"One value", k1, mNum(0), k2, nil] forKey:@"oneKey"];
[vars setObject:[NSDictionary dictionaryWithObjectsAndKeys:mNum(8), k0, @"Another value", k1, mNum(1), k2, nil] forKey:@"anotherKey"];
...
[vars retain];
}
- (int)id { return [[[vars objectForKey:self.key] objectForKey:k0] intValue]; }
- (NSString*)lib { return [[vars objectForKey:self.key] objectForKey:k1]; }
- (int)value { return [[[vars objectForKey:self.key] objectForKey:k2] intValue]; }
-(void)dealloc
{
self.key = nil;
[vars release];
[super dealloc];
}
+(int) idForKey:(NSString*)theKey
{
if (vars == nil) [self initVars];
return [[[vars objectForKey: theKey] objectForKey:k0] intValue];
}
@end