4

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

@property (assign) CLLocationCoordinate2D centroid;

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

centroid: {
      lat: "38.416600086777166",
      lon: "-88.29868011101323"
    }

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

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

        return CLLocationCoordinate2DMake([latitude doubleValue], [longitude doubleValue]);
    }];
}

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

但是,我想做的是返回 CLLocationCoordinate2D 类型,它是一个标量,非id类型。除了定义我自己的客户实现之外,transformerWithBlock:是否有一种干净的方法可以实现这一点?

4

1 回答 1

6

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

NSValue *value = [NSValue valueWithBytes:&coordinate objCType:@encode(CLLocationCoordinate2D)];

然后,要CLLocationCoordinate2D退出:

CLLocationCoordinate2D coordinate;
[value getValue:&coordinate];

从 iOS 6 开始(大概是 OS X 10.8,虽然我还没有检查),有NSValue MapKit Additions 类别,它向 NSValue 添加方法来 wrap 和 unwrap CLLocationCoordinate2D

NSValue *value = [NSValue valueWithMKCoordinate:coordinate];
CLLocationCoordinate2D coordinate = [value MKCoordinateValue];
于 2013-11-19T23:47:12.013 回答