Ios 为什么这个CLLocationCoordinate2D变量是不可分配的?

Ios 为什么这个CLLocationCoordinate2D变量是不可分配的?,ios,objective-c,objective-c-blocks,Ios,Objective C,Objective C Blocks,我有一个geocoder方法,我希望它返回它为我生成的CLLocationCoordinate2D - (CLLocationCoordinate2D)geocode{ CLGeocoder *geocoder = [[CLGeocoder alloc] init]; CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0); [geocoder geocodeAddressDictionar

我有一个geocoder方法,我希望它返回它为我生成的CLLocationCoordinate2D

- (CLLocationCoordinate2D)geocode{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0);

    [geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count]) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            CLLocation *location = placemark.location;
            coordinate = location.coordinate;
        } else {
            NSLog(@"error");
        }
    }];

    return coordinate;
}
coordinate=location.coordinate
会产生错误。XCode表示坐标是一个不可分配的变量。有人知道我做错了什么吗

更新:

在遵循sebastian的建议后,我得到了要编译的代码,但是,
坐标设置不正确。如果您查看我在方法中输入的两个NSLog语句,第一个语句将打印出我需要分配给
坐标
的正确坐标,但是一旦If语句退出,
坐标
将返回到设置为(0,0)。第二条NSLog语句打印(0,0)。有人知道我怎么解决这个问题吗

- (CLLocationCoordinate2D)geocode{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    __block CLLocationCoordinate2D geocodedCoordinate = CLLocationCoordinate2DMake(0,0);

    [geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count]) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            CLLocation *location = placemark.location;
            geocodedCoordinate = location.coordinate;
            NSLog(@"%f, %f", coordinate.longitude, coordinate.latitude); 
        } else {
            NSLog(@"error");
        }
    }];

    NSLog(@"%f, %f", coordinate.longitude, coordinate.latitude); 
    return coordinate;
}

如果要分配给在块范围外定义的变量,必须使用
\u块
关键字:

__block CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0);
看一看

关于编译时未设置的变量:

geocodeAddressDictionary:completionHandler:
异步运行。这意味着它会立即返回,但当结果可用时,块会在稍后执行。您需要更改调用方法的方式。目前,你可能正在做类似的事情

self.myCoordinate = [self geocode];
你需要做的是:

- (void)geocode{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count]) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            CLLocation *location = placemark.location;
            self.myCoordinate = location.coordinate;
            NSLog(@"%f, %f", coordinate.longitude, coordinate.latitude); 
        } else {
            NSLog(@"error");
        }
    }];
}
运行
[self geocode]
会立即返回,块运行时将设置
mycoordinal


如果这样做,请注意这可能导致一个参考循环,因为self被块保留。

“如果这样做,请注意这可能导致一个参考循环”不,它不会。“因为自我被封锁了。”那么<代码>自我
不保留该块