0

私は、NSRegularExpression 検索のオプションの選択を提供する Mac OS X アプリケーション用の Cocoa に取り組んでいます。これらのオプションは、次のように列挙型として表されます。

enum {
NSRegularExpressionCaseInsensitive             = 1 << 0,
NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,
NSRegularExpressionIgnoreMetacharacters        = 1 << 2,
NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,
NSRegularExpressionAnchorsMatchLines           = 1 << 4,
NSRegularExpressionUseUnixLineSeparators       = 1 << 5,
NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6
};
typedef NSUInteger NSRegularExpressionOptions;

ユーザーにこれらのオプションのいずれか (一連のチェックボックス) を選択してもらい、その結果をregularExpressionWithPattern:options:error:メソッドに渡します。これらのオプションは整数として受け取っているため、ユーザーはたとえば 0 と 5 を選択する可能性があります。

ここで適切なテクニックが何であるかわかりません。optionsパラメーターは、ビットごとの OR 演算子を使用して整数を取りますが、これらのチェックボックスでのユーザーの選択から動的に構築して、そのメソッド呼び出しに渡すことができるようにするにはどうすればよいでしょうか?

これは素朴で間違った試みです:

for (NSButtonCell * cell in [sender selectedCells]) {
    NSNumber * tag = [NSNumber numberWithInteger:[cell tag] - 1];
    [self.optionsString stringByAppendingString:[NSString stringWithFormat:@"%@|", [tag stringValue]]];
}

明らかに、optionsは NSString を取りません。しかし、これで私が何をしているのかが明確になり、質問が理解できることを願っています!

4

2 に答える 2

4

ビット単位で、または選択したオプションを使用する必要があります。オペレーターは|=これを簡潔に行うことができます。

セルに0から6のタグが付けられている場合:

NSUInteger options = 0;
for (NSButtonCell * cell in [sender selectedCells])
    options |= (1 << [cell tag]);

[cell tag]サンプルコードから1を引いている理由がよくわかりません。

于 2013-01-01T01:21:37.803 に答える
1

ビットの int 値を使用する場合。(つまり、1、2、4、8 など)

True 選択にはそのまま使用できます。

NSRegularExpressionOptions selectedOptions = 0;
for (NSButtonCell * cell in [sender selectedCells]) {
    selectedOptions = selectedOptions | tag.unsignedIntegerValue;
}

値はフラグであるため、ビットごとの or ( | ) を使用して、いずれかの値でオンになっているフラグを生成できます。

使用する int 値にタグを設定してください。(つまり、1、2、4、8、16、32、および 64)

または、それらを追加することもできます。

それらのビット値は次のとおりです。

enum {
    NSRegularExpressionCaseInsensitive             = 1 << 0,
    NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,
    NSRegularExpressionIgnoreMetacharacters        = 1 << 2,
    NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,
    NSRegularExpressionAnchorsMatchLines           = 1 << 4,
    NSRegularExpressionUseUnixLineSeparators       = 1 << 5,
    NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6
};

    NSRegularExpressionCaseInsensitive             == 0b00000001; // (1)
    NSRegularExpressionAllowCommentsAndWhitespace  == 0b00000010; // (2)
    NSRegularExpressionIgnoreMetacharacters        == 0b00000100; // (4)
    NSRegularExpressionDotMatchesLineSeparators    == 0b00001000; // (8)
    NSRegularExpressionAnchorsMatchLines           == 0b00010000; // (16)
    NSRegularExpressionUseUnixLineSeparators       == 0b00100000; // (32)
    NSRegularExpressionUseUnicodeWordBoundaries    == 0b01000000; // (64)

それらの値は、「ビットごとの or ( | )」と加算の両方で同等です

    Via Addition            NSUInteger value = 2 + 4;
    or bitwise or ( | )     NSUInteger value = 2 | 4;
    Even with Bitshifting   NSUInteger value = (1 << 1) + (1 << 2);
                            NSUInteger value = (1 << 1) | (1 << 2);

     0b00000010   (2)
    +0b00000100  +(4)
    -----------   ---
     0b00000110   (6)

ビット単位の or が便利なのは、フラグをオンにすることです。

       (addition)
     0b00000010   (2)
    +0b00000110  +(6)
    -----------   ---
     0b00001000   (8)



       (bitwise or)
     0b00000010   (2)
    |0b00000110  |(6)
    -----------   ---
     0b00000110   (6)

or は「Both」値のフラグのみをオンにするためです。あなたはあなたが始めたのと同じものを手に入れます。

より複雑な例はこれです。

       (bitwise or)
     0b00010010   (18)
    |0b00000110  |(6)
    -----------   ---
     0b00010110   (22)


       (addition)
     0b00010010   (18)
    +0b00000110  +(6)
    -----------   ---
     0b00011000   (24)

ご覧のように。それらには異なる目的があります。そして、その違いを知ることは重要です。

于 2013-01-01T01:42:25.920 に答える