2012-01-09 3 views
4

NSDictionary에서 값으로 NSDate를 키 및 일부 배열로 추가 할 수 있습니까?NSDictionary의 키로 NSDate

내가 디스크에 사전을 작성하는 모든 요구 사항 해달라고 -이 사람이 그것을 필요로하는 것처럼, 보관 또는 언 아카이빙을 : 내가있는 NSDate 키로 추가 할 이유 NSDictionary with NSDates as keys

그러나이 특히 내가 가져올 수 있도록이다 사전의 모든 키를 사용하고 범위 내에서 날짜를 가져 오는 것과 같은 계산을 수행합니다.

생성시 같은 날짜 값을 가진 두 객체가 동일한 메모리를 공유하는지 여부?

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는이 2 개의 NSDate 객체를 다르게 해석합니까?

또 다른 편집 : 나는 NSDateFormatter를 사용하는있는 NSString에있는 NSDate 변환해야하는 경우 또한

가, 내가 직접 범위 내에서 날짜를 확인할 수 없습니다. 나는 다음과 같은 단계를 수행해야합니다 :

  1. 조건을 수행하고 다시
  2. 범위
  3. 내에서 날짜를 가져 사람들을 다시 변환 사전
  4. 에서 모든 키는 NSString 배열이있는 NSDate의 배열에 다시 변환 받기 날짜 배열 배열로
  5. 이제이 문자열 키를 사용하여 사전에서 값을 가져옵니다!

그래서 더 좋은 방법이 있습니까?

+1

NSString은 (반드시) 같은 동작을하지 않습니다. 동일한 내용의 두 개의 다른 인스턴스를 가질 수 있습니다. 왜 NSDate 키를 사용하여 사전을 만들고 무슨 일이 일어나는지 보지 않겠습니까? –

+0

동의, 당신이 말한 것에 근거하여 나의 질문을 업데이트하고이를 확인하기위한 샘플 프로그램을 작성했습니다. 그러나 문자열 상수는 메모리 위치를 공유합니다. –

+2

형식 문자열에서'% x'을 사용하는 것은 객체 참조의 16 진수 주소를 출력하는 것입니다. 같은 날짜에 두 개의 서로 다른 대상입니다! – wcochran

답변

7

예, 개체는 NSDictionary의 키로 사용할 수 있습니다. 개체 유형은 NSCopying 프로토콜을 지원하는 경우 키로 사용할 수 있습니다. 키는 isEqual:이 아닌을 포인터 값으로 사용하여 비교됩니다. 자세한 내용은 NSDictionary 설명서의 개요 섹션을 참조하십시오.

+0

공식적인 Apple 문서에서 NSDate가 isEqual을 실제로 적절히 오버라이드한다는 보장을 찾을 수 없습니다. NSObject에서 기본 비헤비어를 상속하는 대신 실제 날짜 비교를 수행하는 것입니다. 이 정보에 대한 공식 출처가 있습니까? –

+1

@EugeneOsovetsky - 사양이없는 언어 및 프레임 워크에서의 보증입니까? 음 ... 진실로 암시 적입니다. NSDate는'NSObject' 프로토콜을 구현하며, 인스턴스가 동일하다는 것을 정의하는 'isEqual :'을 필요로합니다. 이제 모든 클래스가 NSObject의 구현을 받아 들일 수 있지만, 클래스가 동일한 의미 값을 가진 별개의 인스턴스를 지원한다면 단순히 프레임 워크에서 작동하지 않을 것입니다. 예를 들어,'NSSet'은'isEqual :'에 의존합니다. 따라서 'isEqual :'이'NSDate '와 같은 특정 클래스에 대해 덮어 쓰여진다는 진술을 발견하지 못하더라도 암시 적입니다. – CRD