我可以将NSInteger作为方法的可选参数吗?

时间:2012-04-04 02:38:48

标签: objective-c ios core-data nsinteger

我希望有一个方法

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

并在实施中,检查nil作为位置。我的想法是,如果提供了职位,我将使用它,如果没有,我会自动分配。

问题是如果没有编译器警告,我无法将NULL或nil传递给它。

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

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

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

也有兴趣了解这两者的“更好”解决方案。

3 个答案:

答案 0 :(得分:3)

<@> @贾斯汀的方法通常是最合适的。但是,关于setData:和KVO的问题,有几点需要注意:

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

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


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

答案 1 :(得分:1)

使用NSNumber包装器非常标准。

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

答案 2 :(得分:0)

有三种选择:

  1. 传递-1或某些“无价值”
  2. 使用NSNumber包装器并将nil传递给“无值”
  3. 过载
  4. 您可以尝试使用Objective-C可选参数机制,但这需要某种标记来标记列表的末尾,所以它并不比其他任何一个好。

相关问题