我希望使用Mantle框架(https://github.com/github/Mantle)来支持具有struct属性的类的NSCoding:
typedef struct {
int x;
int y;
} MPoint;
typedef struct {
MPoint min;
MPoint max;
} MRect;
@interface MObject : MTLModel
@property (assign, nonatomic) MRect rect;
@end
@implementation MObject
@end但是当我试图[NSKeyedArchiver archiveRootObject:obj toFile:@"file"];它在MTLModel+NSCoding.m崩溃,在- (void)encodeWithCoder:(NSCoder *)coder在线
case MTLModelEncodingBehaviorUnconditional:
[coder encodeObject:value forKey:key];Mantle是否支持c-struct编码(以及解码),还是我需要为此类类定制实现NSCoding协议?
发布于 2014-02-19 13:36:56
比我想象的要容易:
+encodingBehaviorsByPropertyKey中的属性示例:
#pragma mark - MTLModel + NSCoding
- (id)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
self.rect = [[self class] mRectFromData:[coder decodeObjectForKey:@"rectData"]];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[super encodeWithCoder:coder];
[coder encodeObject:[[self class] dataFromMRect:self.rect] forKey:@"rectData"];
}
+ (NSDictionary *)encodingBehaviorsByPropertyKey {
NSDictionary *excludeProperties = @{
NSStringFromSelector(@selector(rect)): @(MTLModelEncodingBehaviorExcluded)
};
NSDictionary *encodingBehaviors = [[super encodingBehaviorsByPropertyKey] mtl_dictionaryByAddingEntriesFromDictionary:excludeProperties];
return encodingBehaviors;
}
#pragma mark - MRect transformations
+ (MRect)mRectFromData:(NSData *)rectData {
MRect rect;
[rectData getBytes:&rect length:sizeof(rect)];
return rect;
}
+ (NSData *)dataFromMRect:(MRect)rect {
return [NSData dataWithBytes:&rect length:sizeof(rect)];
}发布于 2013-12-11 09:12:55
我最初的数据结构是XML (是的,我知道):
...
<Lat>32.062883</Lat>
<Lot>34.782904</Lot>
...我使用了基于MTLXMLAdapter的KissXML,但您可以看到它如何适用于任何其他序列化程序。
+ (NSValueTransformer *)coordinateXMLTransformer {
return [MTLValueTransformer reversibleTransformerWithBlock:^id(NSArray *nodes) {
CLLocationCoordinate2D coordinate;
for (DDXMLNode *node in nodes) {
if ([[node name] isEqualToString:@"Lat"]) {
coordinate.latitude = [[node stringValue] doubleValue];
} else if ([[node name] isEqualToString:@"Lot"]) {
coordinate.longitude = [[node stringValue] doubleValue];
}
}
return [NSValue value:&coordinate
withObjCType:@encode(CLLocationCoordinate2D)];
}];
}如果需要,可以添加一个reverseBlock。
https://stackoverflow.com/questions/20471905
复制相似问题