2012-04-04 45 views
0

我想有一个方法沿我可以使NSInteger成为方法的可选参数吗?

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

线,并在执行,检查零的位置。这个想法是,如果提供的位置,我会使用它,如果没有,我会自动分配它。

问题是我不能通过NULL或零进入没有编译器警告。

我相信我在别处见过这种模式(可选参数)。我认为它可能与NSIndexPath有关。

我应该使用NSNumber作为包装吗?还是还有其他一些秘密?另外,我考虑使用不同的方法 - setData:和setData:inPosition :.但问题是'数据'是核心数据创建的属性,而不是常规的伊娃,因此当我真的想要设置值时,我必须记住发送所有KVO消息。例如,在setData:withPosition中,我无法调用标准setData: - 它会覆盖我对该位置所做的任何工作。

也有兴趣知道哪个是这两个'更好'的解决方案。

+0

使用'NSNumber'或超载 – mshsayem 2012-04-04 02:46:51

+1

Objective-C中没有超载。 – 2012-04-04 03:11:09

回答

3

@贾斯汀的方法通常是最合适的。然而,你对setData:和志愿的问题,有几件事情需要注意:只要方法被命名为setFoo:

  • 志愿通知将自动发送。即使您覆盖setFoo:,KVO也会将您的实施与物业的正确KVO通知呼叫包装在一起。这很可能是可可中最神奇的东西。 (我曾经确定它是最神奇的东西,但我开始想知道块变量范围,特别是块如何从堆栈移动到堆;这可能更神奇。)

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


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

+0

哇,这是神奇的。谁知道(呃,你做到了)。 是的,当我提到KVO时,我的意思是还包括setPrimitiveData:方法。 所以我定制了默认的setData:找出一个位置,然后发送到setData:inPosition。但是在setData:inPosition中,我需要实际上,你需要设置数据。如果我使用setData来做到这一点:它将重新计算'position'并将其发送回setData:inPosition :,这反过来使用setData: - 那么你明白了。 或者你是否在说我不应该使用标准setData:实际设置数据,而是使用setPrimitveData:? – 2012-04-04 03:21:38

+1

正确。这里的一个窍门是你是否希望KVO从'setData:inPosition:'发布。如果是这样,你需要自己发布它,并将其从'setData:'中禁用。你可以通过重写'+ automaticallyNotifiesObserversForKey:'来实现,并且为'data'返回NO。 – 2012-04-04 03:25:27

+0

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-BAJEAIEE – 2012-04-04 03:26:45

1

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

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

0

有三个选项:

  1. 传递-1或一些这样的 ”没有价值“
  2. 使用一个NSNumber封装,并通过nil为 ”没有价值“
  3. 超载

您可以尝试使用Objective-C可选参数机制,但需要某种标记来标记列表的末尾,所以它不会比其他任何参数更好。

相关问题