15

私はここで発狂します。なんらかの理由で、NSSet (cocoa) の objectsPassingTest: 関数の使用方法の完全な例が 1 つも見つかりません。誰かがブロックに関するページを教えてくれる前に、私はそれらを見ました。与えられた例は、関数を操作するブロックではなく、関数を宣言する方法のみを示しています。自分のコードで例を試してみたところ、うまくいきませんでした。関数がどのように使用されるかの実例をいくつか見たいだけです。そうすれば、自分で解決できるようになります。

4

2 に答える 2

30

これが簡単な例です。それが役に立てば幸い。

    NSSet *set = [NSSet setWithObjects:@"1",@"2",@"3",@"4",@"5",nil];

    NSLog(@"%@",set); // Output (3,1,4,2,5) ... all objects

    NSSet *o = [set objectsPassingTest:^(id obj,BOOL *stop){
        NSString *so = (NSString *)obj;
        int intval = [so intValue];
        // accept objects less or equal to two
        BOOL r = (intval <= 2);
        return r;
    }];

    NSLog(@"%@",o); // Output (1,2) only objects smaller or equal  to 2
于 2011-03-01T08:43:57.080 に答える
4

私はブロックを使ったことがありません。しかし、私はこれがどのように機能するかを推測します。

NSSet *set = [NSSet setWithObjects:@"FooBar", @"Foo", @"Bar", @"Baz", nil];

NSSet *fooSet = [set objectsPassingTest:^(id obj, BOOL *stop) {
    BOOL testResult = NO;
    NSString *objStr = (NSString *)obj;
    if ([objStr hasPrefix:@"Foo"]) {
        testResult = YES;
    }
    if ([objStr hasSuffix:@"Bar"]) {
        testResult = YES;
    }
    return testResult;
}];

これにより、@ "FooBar"、@ "Foo"、および@ "Bar"のセットが作成されます。これは、これらのみがテストに合格するためです(つまり、YESを返します)。

于 2011-03-01T08:44:12.853 に答える