You can wrap primitive/scalar values in NSValue to pass them to/from methods, functions, or blocks expecting an id
:
NSValue *value = [NSValue valueWithBytes:&coordinate objCType:@encode(CLLocationCoordinate2D)];
Then, to get the CLLocationCoordinate2D
back out:
CLLocationCoordinate2D coordinate;
[value getValue:&coordinate];
As of iOS 6 (and presumably OS X 10.8, though I haven't checked), there's the NSValue MapKit Additions category which adds methods to NSValue to wrap and unwrap CLLocationCoordinate2D
s:
NSValue *value = [NSValue valueWithMKCoordinate:coordinate];
CLLocationCoordinate2D coordinate = [value MKCoordinateValue];