在块中返回非指针对象时出现问题

And*_*nov 4 objective-c core-location objective-c-blocks nsvaluetransformer github-mantle

我正在使用Mantle来帮助我将模型对象转换为JSON.我的一个对象包含一个centroid定义如下的属性:

@property (assign) CLLocationCoordinate2D centroid;

当我处理服务器时,我收到以下格式的属性:

centroid: {
      lat: "38.416600086777166",
      lon: "-88.29868011101323"
    }
Run Code Online (Sandbox Code Playgroud)

所以我决定实现MTLJSONSerializing协议中可用的自定义JSON转换器,定义如下:

+ (NSValueTransformer*)centroidJSONTransformer {
    return [MTLValueTransformer transformerWithBlock:^CLLocationCoordinate2D(NSDictionary *dict) {
        NSNumber *latitude = dict[@"lat"];
        NSNumber *longitude = dict[@"lon"];

        return CLLocationCoordinate2DMake([latitude doubleValue], [longitude doubleValue]);
    }];
}
Run Code Online (Sandbox Code Playgroud)

我遇到的麻烦是+ (instancetype)transformerWithBlock:(MTLValueTransformerBlock)transformationBlock内部的方法MTLValueTransformer接受一个类型的块typedef id (^MTLValueTransformerBlock)(id);,它返回一个类型的值id或任何objective-c指针对象.

但是我要做的是返回CLLocationCoordinate2D类型,它是一个标量非id类型.如果没有定义我自己的客户实现transformerWithBlock:是否有一种干净的方式我可以实现这一点?

And*_*sen 6

您可以在NSValue中包装原始/标量值,以将它们传递给方法,函数或块,从而期望id:

NSValue *value = [NSValue valueWithBytes:&coordinate objCType:@encode(CLLocationCoordinate2D)];
Run Code Online (Sandbox Code Playgroud)

然后,CLLocationCoordinate2D退出:

CLLocationCoordinate2D coordinate;
[value getValue:&coordinate];
Run Code Online (Sandbox Code Playgroud)

从iOS 6开始(可能是OS X 10.8,虽然我还没有检查),有NSValue MapKit Additions类别,它为NSValue添加方法来包装和解包CLLocationCoordinate2Ds:

NSValue *value = [NSValue valueWithMKCoordinate:coordinate];
CLLocationCoordinate2D coordinate = [value MKCoordinateValue];
Run Code Online (Sandbox Code Playgroud)