5

void 戻り値の型を持つ多くのブロックを見てきました。ただし、非 void ブロックを宣言することは可能です。これの用途は?

ブロック宣言、

-(void)methodWithBock:(NSString *(^)(NSString *str))block{
     // do some work
    block(@"string for str"); // call back
}

メソッドを使用して、

[self methodWithBock:^NSString *(NSString *str) {

        NSLog(str); // prints call back
        return @"ret val"; // <- return value for block 
    }];

上記のブロック宣言では、ブロックの NSString 戻り値の型の目的は何ですか? 戻り値 ("ret val") はどのように使用できますか?

4

2 に答える 2

11

void 以外の関数ポインタを使用するのと同じ理由で、非 void ブロックを使用できます。これは、コード実行に関して追加レベルの間接化を提供するためです。

NSArrayは、そのような使用のsortUsingComparator一例を提供します。

NSArray *sorted = [originalArray sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2){
    NSString *lhs = [obj1 stringAttribute];
    NSString *rhs = [obj2 stringAttribute];
    return [lhs caseInsensitiveCompare:rhs];
}];

コンパレータ ブロックを使用すると、並べ替えを実行するメソッドの外部で比較ロジックをカプセル化できます。sortedArrayUsingComparator

于 2013-02-06T19:10:02.480 に答える
4

これは単なる戻り値であるため、このようなことを行って戻り値を利用し、それに対しても作業を行うことができます。

-(void)methodWithBlock:(NSString *(^)(NSString *str))block{
     // do some work

    NSString *string = block(@"string for str"); // call back

    // do something with the return string
    NSLog(@"%@",string);
}
于 2013-02-06T19:09:53.573 に答える