2012-04-04 66 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可選參數機制,但需要某種標記來標記列表的末尾,所以它不會比其他任何參數更好。

相關問題