2012-01-09 63 views
4

是否有可能添加NSDate作爲鍵和一些數組,因爲它在NSDictionary中的值?NSDate作爲NSDictionary的鍵

我沒有寫字典中磁盤的任何要求 - 歸檔或解除封存,就像這個傢伙需要它:NSDictionary with NSDates as keys

可是,我爲什麼要添加的NSDate作爲鍵特別是讓我可以取字典中的所有鍵並執行一些計算,例如從一個範圍內獲取日期。

創建時是否有兩個具有相同日期值的對象共享相同的內存?

是否有可能有NSDate作爲關鍵?另外,我可能會面臨這個假設的其他問題?

感謝,

拉吉

編輯: 發佈我的問題後,我只是寫了一個示例代碼:

NSDateComponents *dateComps = [[NSDateComponents alloc] init]; 
[dateComps setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
[dateComps setDay:1]; 
[dateComps setMonth:1]; 
[dateComps setYear:2012]; 
NSDate *date1 = [[NSCalendar currentCalendar] dateFromComponents:dateComps]; 
NSDate *date2 = [[NSCalendar currentCalendar] dateFromComponents:dateComps]; 
NSLog(@"Date 1 = %x, Date 2 = %x", date1, date2); 

輸出:

Date 1 = 7945610, Date 2 = bd03610 

但不NSDictio的關鍵比較nary將這兩個NSDate對象解釋爲不同?

另一個編輯:

另外,如果我要使用NSDateFormatter的NSDate轉換爲NSString的,我不能直接檢查範圍內的日期。我將必須執行以下步驟:

  1. 獲取密鑰的所有的NSString數組從字典
  2. 將其轉換回的NSDate的陣列
  3. 執行謂詞和範圍內
  4. 取日期
  5. 再轉換回那些日期到字符串數組
  6. 現在使用這個字符串鍵從字典中獲取值!

那麼,有沒有更好的辦法?

+1

NSString的行爲不像那樣(必然) - 你可以有兩個不同的實例具有相同的內容。爲什麼不用NSDate鍵創建字典並查看會發生什麼? – 2012-01-09 10:16:16

+0

同意,基於你所說的更新了我的問題,並寫下了一個示例程序來證實這一點。但字符串常量共享內存位置。 – 2012-01-09 10:44:08

+2

在格式字符串中使用'%x'只是​​輸出對象引用的十六進制地址。他們是同一日期的兩個不同的對象! – wcochran 2013-06-11 18:53:38

回答

7

是,NSDate對象可以用作NSDictionary的密鑰 - 任何對象類型都可以用作密鑰,只要它支持NSCopying協議。通過指針值使用isEqual:而不是來比較密鑰。有關更多詳細信息,請參閱NSDictionary文檔的概述部分。

+0

我在官方的Apple文檔中找不到任何保證,NSDate實際上正確地覆蓋了isEqual:做實際日期比較,而不是繼承NSObject的默認行爲。有這方面的官方消息嗎? – 2013-05-16 15:58:57

+1

@EugeneOsovetsky - 沒有規範的語言和框架中的保證?嗯......嚴重的是它是隱含的。 NSDate實現了'NSObject'協議,並且需要'isEqual:',它定義了實例相等的含義。現在任何類都可以選擇接受'NSObject'的實現,但是如果類支持具有相同語義值的不同實例,那麼它就不適用於框架。例如,'NSSet'依賴'isEqual:'。所以雖然你可能沒有發現'isEqual:'被某個特定的類所覆蓋,比如'NSDate',但它是隱含的。 – CRD 2013-05-16 19:16:47