• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 在子类中添加到父类(super class)的结构

[复制链接]
菜鸟教程小白 发表于 2022-12-13 04:50:33 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 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 等?



Best Answer-推荐答案


不只是扩展一个 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

不幸的是,指针语法让它很丑,但它仍然有效。

关于ios - 在子类中添加到父类(super class)的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27929068/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap