【发布时间】:2013-11-19 23:32:16
【问题描述】:
我正在使用 Mantle 帮助我将模型对象转换为 JSON。我的一个对象包含一个centroid 属性,定义如下:
@property (assign) CLLocationCoordinate2D centroid;
当我与服务器打交道时,我收到这种格式的属性:
centroid: {
lat: "38.416600086777166",
lon: "-88.29868011101323"
}
所以我决定实现一个自定义 JSON 转换器,该转换器在 MTLJSONSerializing 协议中可用,定义如下:
+ (NSValueTransformer*)centroidJSONTransformer {
return [MTLValueTransformer transformerWithBlock:^CLLocationCoordinate2D(NSDictionary *dict) {
NSNumber *latitude = dict[@"lat"];
NSNumber *longitude = dict[@"lon"];
return CLLocationCoordinate2DMake([latitude doubleValue], [longitude doubleValue]);
}];
}
我遇到的问题是MTLValueTransformer 内部的+ (instancetype)transformerWithBlock:(MTLValueTransformerBlock)transformationBlock 方法接受typedef id (^MTLValueTransformerBlock)(id); 类型的块,它返回id 类型的值或任何objective-c 指针对象。
但是我想做的是返回 CLLocationCoordinate2D 类型,它是一个标量,非id 类型。没有定义我自己的 transformerWithBlock: 自定义实现,有没有一种干净的方法可以实现这一点?
【问题讨论】:
-
尝试用
NSValue包装它 -
哪个 API?
NSValue的唯一通用 API 是+ valueWithNonretainedObject:,它接受 id 类型的对象而不是标量。 -
@AndrewLauerBarinov,看看我的回答,但那不是真的。 NSValue 有几种包装各种值的方法,包括任意标量值、指针和 NSRange。
+valueWithNonretainedObject:可能是 NSValue 便利函数中使用最少的。 -
是的@AndrewMadsen 我现在注意到了。我只是在查看自动完成功能中可用的 API。
标签: objective-c objective-c-blocks core-location nsvaluetransformer github-mantle