我不确定你的问题到底是什么。有一种称为 Singleton 的设计模式可确保您只能拥有给定类的一个实例。这不完全是您想要的,但是有一个称为 Multiton 的 Singleton 模式的变体,它为给定的键(在您的情况下为状态名称)保留类的单个实例。这就是[NSNull null]
(单例)或NSNumber
(多例)的工作方式:
NSLog(@"%i", [NSNull null] == [NSNull null]); // 1
NSLog(@"%i", [NSNumber numberWithInt:42] == [NSNumber numberWithInt:42]); // 1
但是这些模式很容易被误用,如果没有它们就可以解决问题可能会好得多。让所有的状态指针指向同一个实例是没有问题的。也就是说,只有创建整个对象图的问题。如果您保持属性可变,这很容易:
State *oregon = [[State alloc] initWithName:@"Oregon"];
State *washington = [[State alloc] initWithName:@"Washington"];
[oregon setNeighbouringStates:[NSSet setWithObject:washington]];
[washington setNeighbouringStates:[NSSet setWithObject:oregon]];
等等。对您的问题更好的解决方案可能是不同的数据模型,不同的方式来表示相邻关系。但这取决于您的要求。
您在评论中说您在字典中有状态。键是状态名称,值是相邻状态名称的数组?如果是这种情况,您可以执行以下操作:
typedef State* (^StateBuilder)(NSString *stateName);
NSDictionary *input = …;
NSMutableDictionary *states = [NSMutableDictionary dictionary];
StateBuilder getState = ^(NSString *stateName) {
State *state = [states objectForKey:stateName];
if (!state) {
state = [[State alloc] initWithName:stateName];
[states setObject:state forKey:stateName];
}
return state;
};
for (NSString *stateName in [input allKeys]) {
State *state = getState(stateName);
NSMutableSet *neighbours = [NSMutableSet set];
for (NSString *neighbourName in [input objectForKey:stateName])
[neighbours addObject:getState(neighbourName)];
[state setNeighbours:neighbours];
}
结果将在[states allValues]
. 当然,block voodoo不是必须的,你可以把states
字典变成实例变量,用正则方法代替block。