[NSDate distantPast]
및 [NSDate distantFuture]
메서드의 반환 유형이 id
인 이유는 무엇입니까? 이 메소드가 NSDate
포인터를 반환하지 않는 이유는 무엇입니까?[NSDate distantPast] 및 [NSDate distantFuture] 메서드가 ID를 반환하는 이유는 무엇입니까?
답변
다형성은 한 가지 방법으로 유효합니다.
NSDate의 하위 클래스를 만들고이 메서드를 재정의한다고 가정 해 보겠습니다. 이 서명으로 그것을 할 수 있습니다, 그래서 당신은 같은 서명을 사용합니다
-(NSDate*) distantPast;
을하지만 당신은 하위 클래스 타입의 포인터 식의 결과를 할당 할 수 없을 것입니다, 당신은해야합니다 결과를 다운 캐스트 :
NSDateSubclass* ptr= (NSDateSubclass*)[someDateSubclassInstance distantPast];
// Downcasting is necessary here, it would give a warning or syntax error otherwise.
은 반환 된 개체가있는 NSDate의 서브 클래스인지 확인하더라도, 당신은 결과를 다운 캐스트 할 필요가있다. 이것이 생성 된 객체를 반환하는 모든 메소드가 ID를 반환하도록 선언 된 이유입니다.
** 업데이트 : ** 현재, [they _do_ return NSDate *'] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/occ/clm/NSDate/distantFuture). –
NSDate
는 추상 슈퍼 클래스이며, distantPast
또는 NSDate
의 개인 서브 클래스를 반환 distantFuture
, 아닌 NSDate
자체.
다형성이 유효하기 때문에 반환 유형은 NSDate 유형 일 수 있습니다. 모든 정적 메서드가 ID를 반환한다는 것을 알았습니까? –
대부분의 인스턴스 메소드도 마찬가지입니다. – iluvcapra
나는 init
방법으로 무엇을 반환해야하는지 묻는 것과 같은 질문을한다고 생각하십니까? ID 또는 클래스에 대한 포인터입니다.
그런 경우에도 클래스 메소드에 대한 Apple의 표준화와 같은 표준화라고 생각할 수 있습니다.
특별한 이유는 없습니다. 다른 포스터는 이러한 메서드가 NSDate의 private 하위 클래스를 반환 할 수 있다고 지적했지만 NSDate의 하위 클래스는 여전히 NSDate입니다. 나는이 메소드가 id 반환 유형에 대한 이유가 역사적이며 "고대로부터 상실"이라는 이유로 오래된 메소드 (예 : Mac OS 이전의 NextStep)를 사용하고있는 것으로 추측합니다. (Mac OS 문서에서 이러한 방법을 살펴보면 Mac OS 10.0에서 정의되었다고 말합니다.)
오래된 학교 접근 방법은 어디서나 익명 객체 포인터를 사용하는 것이 겠지요.
나는 그것을 나중에 깨달았습니다. 나는 그것도 생각했습니다. 그러나 다형성은 한 가지 방법으로 만 유효하므로이 메서드를 사용하여 하위 클래스 유형의 포인터를 초기화하려고하면 구문 오류 또는 경고가 발생하고 반환 유형을 다운 캐스팅해야합니다. –
클래스 클러스터가 반환 형식'id'의 이유가 아니라는 것은 사실입니다. 슈퍼 클래스 리턴 타입을 통해 서브 클래스를 반환하는 것은 유효합니다 :'- (NSArray *) myArrayProperty {return _myInternalArrayWhichIsActuallyMutable; }'괜찮습니다. 상속이 문제입니다 :'+ [NSArray array]'가'(NSArray *)'를 반환하면 NSMutableArray * array = [NSMutableArray array];는 컴파일러를 불평하게 만듭니다. –
- 1. 있는 NSDate distantFuture
- 2. [NSDate distantPast]에 NSString을 비 직렬화
- 3. NSDate
- 4. GMT 시간을 반환하는 NSDate
- 5. 주어진 NSDate 사이의 NSDate
- 6. NSPredicate with NSDate
- 7. NSDate 객체가 누출되는 이유는 무엇입니까?
- 8. NSPredicate 및 NSDate
- 9. NSDate Formatter가 올바르게 변환되지 않고 장치에서 null을 반환하는 이유는 무엇입니까?
- 10. NSDate - timeIntevalSinceDate -
- 11. NSDate 및 SQLite3
- 12. NSDate 및 DateByAddingComponents 문제
- 13. 있는 NSDate 및 NSDateFormatter
- 14. CorePlot CPTAxisLabelingPolicyAutomatic 및 NSDate
- 15. NSDate 및 NSDateFormatter magic
- 16. UIDatePicker 및 NSDate
- 17. NSDate 및 다음 날
- 18. iPhone - NSDate - NSString - NSDate 사이의 변환
- 19. NSDate 결과 from - (NSDate *) dateFromComponents : (NSDateComponents *) comps
- 20. NSFormatter 및 NSdate 문제가 발생했습니다. 있는 NSDate 객체는 null
- 21. 필터가있는 NSDate
- 22. 있는 NSDate
- 23. 있는 NSDate
- 24. '있는 NSDate'
- 25. NSDate 질문
- 26. NSDate 포맷터
- 27. 있는 NSDate
- 28. 문자열의 NSDate
- 29. NSDate 현지화
- 30. 있는 NSDate
관련 : [새로운 인스턴스를 만들 클래스 메소드 (http://stackoverflow.com/q/5987969) –
** 업데이트 : ** 지금 현재, (HTTPS [그들이'있는 NSDate *를'반환 _do_] //developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/occ/clm/NSDate/distantFuture). –