我正在学习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
我该如何使用此代码?谢谢你的好意。
答案 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);
}()];