-1

組み込みのイニシャライザでは許可されていない方法で Cocoa コレクションを構築するためのクラス メソッドがカテゴリにあります。イニシャライザの機能が限られているため、実際にコレクションを構築するには、可変バージョンのコレクションを使用する必要があります。の例を次に示しNS{Mutable}IndexSetます。

@implementation NSIndexSet (WSSNonContiguous)

+ (instancetype)WSSIndexSetFromMask:(NSUInteger)mask
{
    NSMutableIndexSet * set = [NSMutableIndexSet indexSet];

    for( NSUInteger i = 0; i < (sizeof(NSUInteger) * 8); i++ ){
        if( mask & (1l << i) ){
            [set addIndex:i];
        }
    }

    return set;
}

私の戻り値の型は、ここで嘘をつくことがあります。ユーザーが不変バージョンを要求しているかどうかに関係なく、常に可変コレクションが返されます。

instancetypeこのような場合でも使用するのは適切ですか、それとも使用する必要がありidますか? を使用する場合instancetype、明示的にコレクションを再作成する必要があります。

// Ick?
return [[self alloc] initWithIndexSet:set];

+[NSIndexSet WSSIndexSetFromMask:]呼び出しが?のときに不変のコピーが返されるようにします。

4

1 に答える 1

2

すべてが大丈夫です:

NSIndexSet *set = [[NSIndexSet WSSIndexSetFromMask:0] addIndex:0];

No visible @interface for 'NSIndexSet' declares the selector 'addIndex:'

instancetypeサブタイプであっても受信者型のインスタンスを返すことを送信者に伝えます。NSIndexSet のクラス オブジェクトに送信されるため、送信者にとっては NSIndexSet です。

誰かが戻り値の型を見てサブクラスを見て、この情報から何らかの利点を得るという内省は、形式が正しくありません。コントラクトは戻り型で構築され、これはこの場合 NSIndexSet です。

于 2013-05-25T21:32:17.590 に答える