gpt4 book ai didi

objective-c - Objective C - 覆盖 setter 以接受不同类型的对象

转载 作者:行者123 更新时间:2023-11-28 19:17:11 25 4
gpt4 key购买 nike

我正在尝试覆盖 NSManagedObject 的 setter ,以便我可以传入不同类型的对象,进行转换,然后设置属性。像这样:

- (void)setContentData:(NSData *)contentData
{
NSString *base64String;
// do some stuff to convert data to base64-encoded string
// ...
[self willChangeValueForKey:@"contentData"];
[self setPrimitiveValue:base64String forKey:@"contentData"];
[self didChangeValueForKey:@"contentData"];
}

因此,在这种情况下,我的 NSManagedObjectcontentData 字段是一个 NSString *,我想让 setter 接受一个NSData * 然后我将其转换为 NSString * 并将其保存到模型中。但是,如果我尝试这样做,我会收到编译器关于尝试将 NSData * 分配给 NSString * 的警告:

myObject.contentData = someNSData;

-> Incompatible pointer types assigning to 'NSString *' from 'NSData *__strong'

有没有更好的方法来解决这个问题,或者我应该完全避免 setter 并创建自定义“ setter ”,允许我传入 NSData * 并设置 NSString * 字段没有编译器警告?

最佳答案

我认为这是一个例子,您与工具和框架的斗争是一种重要的设计气味。放弃这种试图覆盖类的基本属性的预期数据类型的想法。

你没有说你正在子类化的 NSManagedObject 是否在你的控制之下。如果它是您设计的一部分,让它成为管理其他类型的 contentData 而非 NSString 的模板,那么在根类中将其声明为类型 id 并专注于子类。这应该可以防止警告。

您可能想遵循 cocoa 主义:不要子类化。您是否可以通过将父类(super class)提取到一个辅助类中来实现您从父类(super class)中寻找的任何功能,该辅助类作为每个不同行为的托管对象类的属性持有?

关于objective-c - Objective C - 覆盖 setter 以接受不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11349994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com