gpt4 book ai didi

objective-c - 在 block 中返回非指针对象时出现问题

转载 作者:太空狗 更新时间:2023-10-30 04:02:03 25 4
gpt4 key购买 nike

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

@property (assign) CLLocationCoordinate2D 质心;

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

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

所以我决定实现一个自定义的 JSON 转换器,它在 MTLJSONSerializing 协议(protocol)中可用,定义如下:

+ (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 类型的 block id (^MTLValueTransformerBlock)(id);,它返回类型为 id 的值或任何 objective-c 指针对象。

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

最佳答案

您可以将原始值/标量值包装在 NSValue 中,以将它们传递给需要 id 的方法、函数或 block :

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

然后,要返回 CLLocationCoordinate2D:

CLLocationCoordinate2D coordinate;
[value getValue:&coordinate];

从 iOS 6 开始(大概是 OS X 10.8,虽然我还没有检查过),有 NSValue MapKit Additions category它向 NSValue 添加方法来包装和解包 CLLocationCoordinate2Ds:

NSValue *value = [NSValue valueWithMKCoordinate:coordinate];
CLLocationCoordinate2D coordinate = [value MKCoordinateValue];

关于objective-c - 在 block 中返回非指针对象时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20084442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com