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:是否有一种干净的方式我可以实现这一点?
您可以在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)
| 归档时间: |
|
| 查看次数: |
441 次 |
| 最近记录: |