48

NSSetおよびNSOrderedSet操作は、新しいObjective-Cコレクションリテラルで実行できますか?

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

FWIW、このBig Nerd Ranch Postは、インデックス構文がNSOrderedSetで機能することになっていると述べています。しかし、私のテストではそうではありません。そして、私は順序集合の作成について何も見つけることができませんでした。

4

2 に答える 2

48

NSSet の Objective-C リテラル構文はありません。キーベースの添字はそうかもしれませんが、インデックスの添字を使用して NSSet 要素にアクセスすることはあまり意味がありません。ラップまたはサブクラス化することで、独自のものを追加できます

(訂正): もともと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 によるこの優れた投稿によると、インデックス付き添字をサポートするために使用されるメソッドを独自のオブジェクトに追加できます。

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

オブジェクトベースのキーイングの同様の方法:

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

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

于 2012-12-06T05:30:00.140 に答える
43

NSSetの場合、これを試してみるのはどうですか:

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

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

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

;-)

于 2013-03-02T10:00:39.770 に答える