首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Mantle编码c-struct (NSCoding)

用Mantle编码c-struct (NSCoding)
EN

Stack Overflow用户
提问于 2013-12-09 13:32:15
回答 2查看 1.6K关注 0票数 4

我希望使用Mantle框架(https://github.com/github/Mantle)来支持具有struct属性的类的NSCoding:

代码语言:javascript
复制
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在线

代码语言:javascript
复制
case MTLModelEncodingBehaviorUnconditional:
    [coder encodeObject:value forKey:key];

Mantle是否支持c-struct编码(以及解码),还是我需要为此类类定制实现NSCoding协议?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-19 13:36:56

比我想象的要容易:

  1. 排除+encodingBehaviorsByPropertyKey中的属性
  2. 手动编码/编码排除的属性

示例:

代码语言:javascript
复制
#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)];
}
票数 4
EN

Stack Overflow用户

发布于 2013-12-11 09:12:55

我最初的数据结构是XML (是的,我知道):

代码语言:javascript
复制
  ...
  <Lat>32.062883</Lat>
  <Lot>34.782904</Lot>
  ...

我使用了基于MTLXMLAdapterKissXML,但您可以看到它如何适用于任何其他序列化程序。

代码语言:javascript
复制
+ (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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20471905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档