2015-01-13 93 views
2

我使用Mogenerator建设类我CoreData,我爱它基于关闭CoreData属性,像这样的_TAGUser头文件的属性名称:添加到超类的结构在子类

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呼吁国际志愿者组织,部分映射NSFetchedResultsController等?

+1

你不必检查:'self.displayName!= nil'。在发送到'nil'的Objective-C消息中返回0,所以如果'self.displayName'为'nil',则'self.displayName.length'将为0。 –

回答

1

一个不会简单地扩展C结构。你有两种可能的方法:

  • 使用NSStringFromSelector(firstLetterOfDisplayName)的志愿等等。这样你得到一些编译器的安全性。如果具有给定名称的选择器不存在,编译器将会抱怨。但是,选择器可以存在于可见范围内的任何地方,不仅在您的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 

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

+0

是的,我想你不能只扩展一个C结构,因为它不是面向对象的,但这些都是有意义的。也许我会做第二个建议,或者制作一个属性或方法,它是'NSStringFromSelector(firstLetterOfDisplayName)'的包装器。将这个开放几天,看看是否有其他建议,但否则我会接受答案。谢谢! –