0

我想有一种方法

setData:(SomeClassName *)data inPosition:(NSInteger)position

在实现中,检查 nil 作为位置。这个想法是,如果提供了位置,我将使用它,如果没有,我将自动分配它。

问题是我不能在没有编译器警告的情况下将 NULL 或 nil 传递给它。

我相信我在其他地方看到过这种模式(可选参数)。我认为它可能与 NSIndexPath 有关。

我应该使用 NSNumber 作为包装器吗?还是有其他秘密?

顺便说一句,我考虑使用单独的方法 - setData: 和 setData:inPosition:。但问题是“数据”是一个核心数据创建属性,而不是常规 ivar,所以当我真正想要设置该值时,我必须记住发送所有 KVO 消息。例如,在 setData:withPosition 中,我不能调用标准的 setData: - 它会覆盖我对该位置所做的任何工作。

也会有兴趣知道这两者中哪个是“更好”的解决方案。

4

3 回答 3

3

@Justin 的方法通常是最合适的。但是,对于您关于setData:KVO 的问题,有几点需要注意:

  • 只要方法名为 ,就会自动发送 KVO 通知setFoo:。即使您覆盖setFoo:,KVO 也会使用该属性的正确 KVO 通知调用来包装您的实现。这很可能是 Cocoa 中最神奇的东西。(我曾经确信这是最神奇的事情,但我开始怀疑块变量的作用域,尤其是块如何从堆栈移动到堆;这可能更神奇。)

  • 如果您需要直接设置 Core Data 属性,绕过 KVO 和所有其他可能的魔法,您可以使用原始访问器。setPrimitiveData:setData:用于设置属性的底层方法。您不应该覆盖原始访问器。


@Justin 似乎已经删除了他的答案。这里的典型解决方案是声明setData:and setData:inPosition:(顺便说一句,作为读者,我不知道“inPosition”是什么意思。我希望它在上下文中有意义)。setData:会调用setData:inPosition:应用任何必要的东西来确定“位置”。

于 2012-04-04T02:53:29.897 回答
1

使用 NSNumber 包装器是非常标准的。

当然,你总是可以传递 -1、NSNotFound,或者定义你自己的 n/a 值。

于 2012-04-04T02:41:19.837 回答
0

有三个选项:

  1. 通过 -1 或类似的“无价值”
  2. 使用 NSNumber 包装器并传递nil“无值”
  3. 超载

您可以尝试使用 Objective-C 的可选参数机制,但这需要某种哨兵来标记列表的结尾,因此它并不比其他任何一个更好。

于 2012-04-04T03:12:34.017 回答