2014-03-19 46 views
1

我已经下载这个Raywenderlich tutorial,我遇到了这部分代码的问题。ARC语义问题,语义问题错误。

我还是iOS开发新手,我不明白这是什么意思。我通过互联网搜索,但没有一个是答案。

请帮我解决这个问题。

int index = [_locations indexOfObjectPassingTest:^(id obj, NSUInteger index, BOOL *stop) { 
    return [[obj location] isEqual:location]; 
}]; 

有3个误差如下:命名为“位置”

多种方法与失配的结果是,参数类型中找到或属性

不相容的嵌段指针类型发送“无效(^) (__strong ID,NSUInteger,BOOL *)”到类型的参数 'BOOL(^)(__强ID,NSUInteger,BOOL *)'

为接收器类型 'CGFloat的'(亦称 '浮动')

下面是完整的代码,在那里你可以找到这一行:

- (void)didTouchMarkerView:(MarkerView *)markerView 
{ 
    ARGeoCoordinate *tappedCoordinate = [markerView coordinate]; 
    CLLocation *location = [tappedCoordinate geoLocation]; 

    int index = [_locations indexOfObjectPassingTest:^(id obj, NSUInteger index, BOOL *stop) { 
    return [[obj location] isEqual:location]; 
    }]; 

    if(index != NSNotFound) 
    { 
     Place *tappedPlace = [_locations objectAtIndex:index]; 
     [[PlacesLoader sharedInstance] loadDetailInformation:tappedPlace successHanlder:^(NSDictionary *response) { 
      NSLog(@"Response: %@", response); 
      NSDictionary *resultDict = [response objectForKey:@"result"]; 
      [tappedPlace setPhoneNumber:[resultDict objectForKey:kPhoneKey]]; 
      [tappedPlace setWebsite:[resultDict objectForKey:kWebsiteKey]]; 
      [self showInfoViewForPlace:tappedPlace]; 
    } errorHandler:^(NSError *error) { 
     NSLog(@"Error: %@", error);}]; 
    } 
} 

回答

1

书面你逝去的返回void块,但该方法的签名要求您在返回BOOL块传递。

只是让这个小除了你传递作为参数块:

在未来,只需点击进入,或者当代码完成建议的方块标记标签,您将不必担心记不住语法...

至于命名location的多种方法中,您有:

  1. 命名的属性locations WHI CH您是通过合成的吸气剂_locations
  2. 访问名为locationCLLocation的实例,它的作用范围是方法
  3. 您也正在强烈的承诺,每一个对象存储在您的_locations财产绝对程序有任何一财产或它的方法自己叫location,这可能会或可能不等于方法从#2作用域location

我可以建议您尝试通过“清洁守则”人士青睐的策略,并沉迷于长以及更多的描述性方法和变量名称。简单地这样做可能会突出显示您的location不匹配,并让您看到发生了什么。

很难从发布的代码量推测CGFloat糟糕的接收器类型,但我敢打赌,你有一些NSNumber/CGFloat不匹配发生。你可以使用[NSNumber numberWithFloat:someFloat]创建一个NSNumber,你可以调用[someNumber floatValue]从NSNumber中提取一个浮点数。

2

只要改变return语句下面,

return [[(Place *)obj location] isEqual:location]; 

它会删除错误。

+1

有同样的问题。这个答案应该被标记为这个特定问题的接受答案。 –