objective-c – 我可以覆盖setValue:forKey:?

objective-c – 我可以覆盖setValue:forKey:?,第1张

概述我有一个对象很可能将NSNull设置为其所有属性的值,并且我正在使用与NSNull值不兼容的代码.有可能覆盖setValue:forKey:在我的对象中这样吗? -(void)setValue:(id)value forKey:(NSString *)key { if ([value isEqual:[NSNull null]]) { [super setValue:ni 我有一个对象很可能将NSNull设置为其所有属性的值,并且我正在使用与NSNull值不兼容的代码.有可能覆盖setValue:forKey:在我的对象中这样吗?

-(voID)setValue:(ID)value forKey:(Nsstring *)key {    if ([value isEqual:[NSNull null]]) {        [super setValue:nil forKey:key];    } else {        [super setValue:value forKey:key];    }}

当object.property = [NSNull null]被设置时,不会调用该方法.如何将此设置为我的setter的默认行为?

解决方法 肯定有办法做到这一点.您可以声明相关属性@dynamic,然后使用resolveInstanceMethod:实际按需创建setter.您可以在 sample code for iOS:PTL中找到这样的示例.此示例演示如何自动使访问者读取和写入字典(属性)而不是ivars.为了使这个工作,您可能需要始终将NSNull存储在字典中并覆盖getter(propertyIMP())以将其转换为nil.所以你要改变这个:

[[self propertIEs] setValue:value forKey:key];

至:

[[self propertIEs] setValue:(value ?: [NSNull null]) forKey:key];

并改变:

return [[self propertIEs] valueForKey:NsstringFromSelector(_cmd)];

至:

ID value = [[self propertIEs] valueForKey:NsstringFromSelector(_cmd)];return (value == [NSNull null] ? nil : value);

或类似的东西.

但是……除非这是一次重大胜利,否则我会避免这种魔力.我对此的典型解决方案是采用另一种方式,并将它放在调用者上,不应该传递[NSNull null].我使用像RNNonNull()这样的函数:

ID RNNonNull(ID x) { return (x == [NSNull null]) ? nil : x; }

然后调用者负责添加包装器:

obj.foo = RNNonNull(mystuff);

如果那是不可能的,我可能会手动覆盖getter以将NSNull转换为nil,而不是使用运行时(它是一行方法).我使用运行时的唯一原因是,如果有一堆属性,并且对象非常简单(纯粹是数据对象).

总结

以上是内存溢出为你收集整理的objective-c – 我可以覆盖setValue:forKey:?全部内容,希望文章能够帮你解决objective-c – 我可以覆盖setValue:forKey:?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215351.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存