web-dev-qa-db-ja.com

NSSetおよびNSOrderedSetの客観的なCリテラル?

新しいObjective-Cコレクションリテラルを使用して、NSSetおよびNSOrderedSet操作を実行できる場合、それは何ですか?

NSArray、NSDictionary、およびNSNumberについては、 here を参照してください。

FWIW、 このBig Nerd Ranch Post は、インデックス作成構文がNSOrderedSetで機能すると想定されていることを示しています。しかし、私のテストではそうではありません。また、順序付きセットの作成については何も見つかりませんでした。

45

NSSet用のObjective-Cリテラル構文はありません。 NSSet要素にアクセスするためにインデックスの添え字を使用することは、実際には意味がありませんが、キーベースの添え字は可能です。ラップするか、サブクラス化することにより、couldを追加できます。

(修正):元々NSOrderedSetもサポートされていないと思っていましたが、インデックスの添え字の使用はサポートされていることがわかりましたが、 NSOrderedSetをリテラル構文で初期化する方法になります。ただし、initWithArray:を使用して、リテラル配列を渡すこともできます。

NSMutableOrderedSet* oset = [[NSMutableOrderedSet alloc] initWithArray: 
    @[@"a", @"b", @"c", @"d", @42]];

oset[2] = @3;
NSLog(@"OrderedSet: %@", oset);

出力:

OrderedSet: {(
    a,
    b,
    3,
    d,
    42
)}

Mike Ashによる this excellent post によれば、独自のオブジェクトにインデックス付き添字をサポートするために使用されるメソッドを追加できます。

- (id)objectAtIndexedSubscript:(NSUInteger)index;
- (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;

オブジェクトベースのキーイングのための同様のメソッド:

- (id)objectForKeyedSubscript: (id)key;
- (void)setObject: (id)obj forKeyedSubscript: (id)key;

したがって、NSSetの周りにラッパーを実装して(または、もう少し作業して、サブクラス化して)キーベースの取得を提供できます。涼しい!

46
mvl

NSSetの場合、これを試してみてください:

#define $(...)  [NSSet setWithObjects:__VA_ARGS__, nil]

そして、次のように使用します:

NSSet *addresses = $(addr1,addr2,addr3,addr4);

;-)

39
Devarshi