在子类中添加超类的结构

时间:2015-01-13 18:33:27

标签: ios objective-c mogenerator

我使用Mogenerator为我的CoreData构建类,我喜欢它根据_TAGUser的头文件中的CoreData属性生成的属性名称:

extern const struct TAGUserAttributes {
    __unsafe_unretained NSString *displayName;
    __unsafe_unretained NSString *email;
} TAGUserAttributes;

@interface _TAGUser : NSManagedObject

@property (nonatomic, strong) NSString* displayName;
@property (nonatomic, strong) NSString* email;

@end

这在实现文件中:

const struct TAGUserAttributes TAGUserAttributes = {
    .displayName = @"displayName",
    .email = @"email",
};

@implementation _TAGUser

@end

现在在子类TAGUser中,我将此属性添加到头文件中:

@interface TAGUser : _TAGUser {}

@property (strong, nonatomic, readonly) NSString *firstLetterOfDisplayName;

@end

这是执行文件:

@implementation TAGUser

- (NSString *)firstLetterOfDisplayName {
    return ((self.displayName != nil && self.displayName.length > 0) ?
        [self.displayName substringToIndex:1].uppercaseString :
        nil);
}

@end

有没有办法可以扩展或添加到结构TAGUserAttributes,以便我的代码中的任何其他地方都可以在TAGUserAttributes.firstLetterOfDisplayName上调用KVO,NSFetchedResultsController中的部分映射等?

1 个答案:

答案 0 :(得分:1)

不只是扩展C结构。您有两种可能的方法:

  • NSStringFromSelector(firstLetterOfDisplayName)用于KVO等。这样您就可以获得一些编译器安全性。如果不存在具有给定名称的选择器,编译器将会抱怨。但是,选择器可以存在于可见范围内的任何位置,而不仅仅存在于TagUser类中,以使编译器满意。

  • 我在这里看到的另一种方法是添加另一种结构,包含指向原始结构的指针。我现在无法想出更好的命名,但我希望这是可以理解的:

在.h文件中

extern const struct TAGUserAdditionalAttributes {
    const struct TAGUserAttributes* base;
    __unsafe_unretained NSString * firstLetterOfDisplayName;
} TAGUserAdditionalAttributes;
在.m文件中

const struct TAGUserAdditionalAttributes TAGUserAdditionalAttributes = {
    .base = &TAGUserAttributes,
    .firstLetterOfDisplayName = @"firstLetterOfDisplayName"
};

   //then you can use "base" attributes like this:
   TAGUserAdditionalAttributes.base->displayName

不幸的是,指针语法使它非常难看,但它仍然有效。