5

我见过许多返回类型为 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'ssortUsingComparator提供了这种使用的一个例子:

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 回答