因此,我理解Objective-C中的Categories可用于向类添加方法而无需子类化。我也理解这些类别不能用于向类添加实例变量。
我做了一些关于Class Extensions的阅读,它可以用来添加实例变量,但我不明白如何使用Class Extensions来修改现有的类,如NSData。
我的问题如下:
我有一个包含NSURL和NSData的核心数据模型。 NSData显示NSURL的数据。当视图需要显示数据时,我会进行以下检查: ---如果[NSData bytes]> 0,显示NSData。 ---否则,在NSURL处获取数据并在返回时显示数据
足够简单。但是,当NSURL更新时,我遇到了问题。因此,如果我使用新图像修改NSURL路径,因为[NSData bytes]已经大于0,我不会进行额外调用来获取新图像。
我想要做的是向NSData添加一个名为URLKey的实例变量,该变量将保存有关数据来源的信息。我无法继承NSData,因为我正在使用CoreData。
有人知道一些简单的解决方案吗?也许我对Class Extensions的理解存在差距,或者可能没有简单的方法。
答案 0 :(得分:2)
类扩展应该用在你自己实现的类上,以保持ivars和一些属性隐藏在头文件中,这应该只包含在类外可见的东西(而且这些东西不是那种东西) )。
类别用于已实现的类,作为添加其他功能的方法。当您想要向已知类添加一般行为时,通常需要它们。例如。向NSString +(NSString *)reversedString; 添加一个方法,该方法返回一个反向实例,以便您可以像这样使用它:
NSString *someString = @"string";
NSString *reverse = [someString reversedString];
NSLog(@"%@", someString); //this would output "gnirts"
关于您的特定问题,我可以向您保证您的CoreDataModel不包含NSURL或NSData。支持的类型是基元,字符串,二进制数据和可转换。因此,如果您愿意,可以将NSData或NSURL子类化,然后通过将类型设置为“可转换”将其与CoreData一起使用。完成此操作后,您可以根据需要继承NSData并在过程中使用类扩展,或者只使用类别将所需的方法添加到类中。
引用Apple关于可转换属性的信息:
可转换属性背后的理念是您访问 属性作为非标准类型,但在Core Data使用的幕后 NSValueTransformer的一个实例,用于将属性转换为 NSData的一个实例。然后,Core Data将数据实例存储到 持久存储。