我希望有一个方法
setData:(SomeClassName *)data inPosition:(NSInteger)position
并在实施中,检查nil作为位置。我的想法是,如果提供了职位,我将使用它,如果没有,我会自动分配。
问题是如果没有编译器警告,我无法将NULL或nil传递给它。
我相信我在其他地方看到了这种模式(可选参数)。我认为它可能与NSIndexPath有关。
我应该使用NSNumber作为包装吗?还是有其他秘密?
顺便说一下,我考虑使用单独的方法--setData:和setData:inPosition:。但问题是“数据”是核心数据创建的属性,而不是常规的ivar,所以当我真正想要设置值时,我必须记住发送所有KVO消息。例如,在setData:withPosition中,我无法调用标准的setData: - 它会覆盖我对该位置所做的任何工作。
也有兴趣了解这两者的“更好”解决方案。
答案 0 :(得分:3)
setData:
和KVO的问题,有几点需要注意:
只要方法名为setFoo:
,就会自动发送KVO通知。即使您覆盖setFoo:
,KVO也会使用对该属性的正确KVO通知调用来包装您的实现。这很可能是Cocoa中最神奇的东西。 (我曾经确定它是最神奇的东西,但我开始怀疑块变量作用域,特别是块如何从堆栈移动到堆;这可能更神奇。)
如果您需要直接设置Core Data属性,绕过KVO以及其他所有可能的魔法,您可以使用原始访问器。 setPrimitiveData:
是setData:
用于设置属性的基础方法。您不应该覆盖原始访问者。
setData:
和setData:inPosition:
(顺便说一句,作为读者,我不知道“inPosition”的意思。我希望它在上下文中有意义)。 setData:
会调用setData:inPosition:
应用任何必要的内容来确定“位置”。
答案 1 :(得分:1)
使用NSNumber包装器非常标准。
当然,您总是可以传递-1,NSNotFound或定义自己的n / a值。
答案 2 :(得分:0)
有三种选择:
nil
传递给“无值”您可以尝试使用Objective-C可选参数机制,但这需要某种标记来标记列表的末尾,所以它并不比其他任何一个好。