我试图使用块语法,但它不起作用

时间:2014-04-08 04:52:37

标签: objective-c objective-c-blocks

我正在学习Block Syntax,但出了点问题。

第一个代码如下:

CLLocationCoordinate2D centerCoordinate = [Location sharedManager].coordinate;
MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
MKCoordinateRegion coordinateRegion = MKCoordinateRegionMake(centerCoordinate, span);
[self.mapView setRegion:coordinateRegion animated:YES];

以下代码(我的第一次尝试)有效:

MKCoordinateRegion (^aRegion)() = ^(void)
{
    CLLocationCoordinate2D centerCoordinate = [Location sharedManager].coordinate;
    MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
    return MKCoordinateRegionMake(centerCoordinate, span);
};
[self.mapView setRegion:aRegion() animated:YES];

但下面的代码(我的第二次尝试)并不起作用:

[self.mapView setRegion:(MKCoordinateRegion^(void)){
    CLLocationCoordinate2D centerCoordinate = [Location sharedManager].coordinate;
    MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
    return MKCoordinateRegionMake(centerCoordinate, span);
}];

错误信息如下:

1. Block pointer to non-function type is invalid.
2. Unexpected type name 'CLLocationCoordinate2D': expected expression

enter image description here

我该如何使用此代码?谢谢你的好意。

2 个答案:

答案 0 :(得分:1)

在您的情况下,该方法将块体提供给块。因此返回的值(MKCoordinateRegionMake)将返回到块的调用者,该调用者不存在。(setRegion:此处不是调用者)。

你可以做的是你能做到这一点:

MKCoordinateRegion (^aRegion)() = ^(void)
{
   CLLocationCoordinate2D centerCoordinate = [Location sharedManager].coordinate;
   MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
   return MKCoordinateRegionMake(centerCoordinate, span);
};
   [self.mapView setRegion:aRegion() animated:YES];

此外,如果你仍然想要一个块式执行,你可以试试这个:

[self.mapView setRegion:({
    CLLocationCoordinate2D centerCoordinate = [Location sharedManager].coordinate;
    MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
    MKCoordinateRegion region= MKCoordinateRegionMake(centerCoordinate, span);
    region;
})];

第二个不是块,而是它的语法。

答案 1 :(得分:1)

让我们从这些好评中回答:

在我看来,实际执行块的代码和块的返回结果是传递给setRegion的参数:第二次尝试将块本身作为参数传递给setRegion:,这当然是期待MKCoordinateRegion作为参数,而不是块。

并且(归功于MartinR),您可以使用一组额外的括号强制评估该块:

编辑我最终会做到这一点

[self.mapView setRegion:^MKCoordinateRegion(void){
    CLLocationCoordinate2D centerCoordinate = [Location sharedManager].coordinate;
    MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
    return MKCoordinateRegionMake(centerCoordinate, span);
}()];