あなたの質問が正確に何であるかわかりません。シングルトンと呼ばれるデザインパターンがあり、特定のクラスのインスタンスを1つだけ持つことができます。これは正確にはあなたが望むものではありませんが、与えられたキー(あなたの場合は州名)のクラスの単一のインスタンスを保持するMultitonと呼ばれるシングルトンパターンの変形があります。これは、[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]
ます。もちろん、ブロックブードゥーは必要ありません。states
辞書をインスタンス変数に変換し、ブロックの代わりに通常のメソッドを使用できます。