首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我试着用块语法,但它不起作用

我试着用块语法,但它不起作用
EN

Stack Overflow用户
提问于 2014-04-08 04:52:36
回答 2查看 721关注 0票数 0

我在学阻止语法但出了点问题。

第一个代码如下:

代码语言:javascript
复制
CLLocationCoordinate2D centerCoordinate = [Location sharedManager].coordinate;
MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
MKCoordinateRegion coordinateRegion = MKCoordinateRegionMake(centerCoordinate, span);
[self.mapView setRegion:coordinateRegion animated:YES];

下面的代码(我的第一次尝试)奏效了:

代码语言:javascript
复制
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];

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

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

错误消息如下:

代码语言:javascript
复制
1. Block pointer to non-function type is invalid.
2. Unexpected type name 'CLLocationCoordinate2D': expected expression

我该如何处理这段代码?谢谢你的好意。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-08 05:21:52

在您的示例中,该方法向块提供主体。因此,返回的值(MKCoordinateRegionMake)将返回给不存在的块的调用方。(setRegion:不是这里的调用者)。

相反,你可以这样做:

代码语言:javascript
复制
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];

此外,如果您仍然想要块式的执行,可以尝试以下操作:

代码语言:javascript
复制
[self.mapView setRegion:({
    CLLocationCoordinate2D centerCoordinate = [Location sharedManager].coordinate;
    MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
    MKCoordinateRegion region= MKCoordinateRegionMake(centerCoordinate, span);
    region;
})];

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

票数 1
EN

Stack Overflow用户

发布于 2014-04-08 05:22:16

让我们从这些好的评论中得出一个答案:

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

而且(归功于MartinR),您可以使用额外的括号强制对块进行计算:

编辑,我最终会做好这件事的

代码语言:javascript
复制
[self.mapView setRegion:^MKCoordinateRegion(void){
    CLLocationCoordinate2D centerCoordinate = [Location sharedManager].coordinate;
    MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
    return MKCoordinateRegionMake(centerCoordinate, span);
}()];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22927826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档