2014-04-13 1 views
3

나는 Stanford's CS193P course에서 배우고 있습니다. 수업에서 폴은 데모 프로젝트 인 "계산기"를 가지고 있는데 여기에서 그는 재산의 유형으로 id을 사용합니다. 그는 특정 클래스를 사용하지 않으려합니다. 새 클래스를 만들고 싶지 않고 문서를 작성할 필요가 없기 때문입니다. 심지어 업데이트 될 때에도 클래스를 다시 디자인 할 필요가 없습니다. id은 이러한 모든 문제를 해결할 수 있습니다.공개 API에서 반환 유형 또는 매개 변수 유형으로 'id'를 사용하는 데는 충분한 이유가 있습니까?

정말 좋은 방법입니까? id은 속성의 반환 유형이며 다른 메서드의 매개 변수 유형으로 사용됩니다. 호출자는 id이 무엇인지, 그리고 올바른 개체를 제공하는 방법을 어떻게 알 수 있습니까? 코드 주석을 읽음으로써?

일반적으로 공용 API에서 반환 유형 또는 매개 변수 유형으로 id을 사용하는 데는 이유가 있습니까? (init 및 공장 방법을 제외하고도 사람들을 위해, instancetype 권장하지만.)

+1

참고 [그 이름이 방법에 대한 중복은'init' 시작 (http://clang.llvm.org/docs/LanguageExtensions.html#related-result-types). –

+0

정말 모호한 'id'를 실행하는 가장 일반적인 장소는 JSON에서 생성 한 NSArray 또는 NSDictionary와 같은 요소에 액세스 할 때입니다. 그러한 경우 런타임에 명시 적으로 테스트하여 어떤 유형이 존재하는지 판별해야 할 수 있습니다. –

답변

1
  1. 당신의 방법은 클래스 클러스터의 구성원 인 클래스를 반환하는 경우, 당신은 id를 반환해야합니다.

  2. 클래스가 불투명하고 공용 헤더에 선언되지 않은 객체를 반환하는 경우 id을 반환해야합니다. 코코아는 가끔 토큰이나 컨텍스트 데이터와 같은 객체를 사용합니다.

  3. 컨테이너 클래스는 항상 해당 구성 요소를 받아 들여 id으로 반환해야합니다. instancetype`의`것을

+0

나는 3 번째를 알았다. # 2에서는 실제로 좋은 예입니다. 호출자가 변경하지 않는 컨텍스트 또는 토큰. 참조로 사용하고 다른 API로 전달합니다. # 1의 경우 호출자는 여전히 변경할 수 없다고 생각합니다. 향후 사용을 위해 참조를 유지하십시오. – ExBen

+0

질문 2, 실제 사례가 있습니까? – ExBen

+0

# 2의 경우 두 가지 예가 있습니다 : 'AVPlayer'의'addPeriodicTimeObserverForInterval :'메소드는 플레이어가 콜백 할 때 사용되는 불투명 한 컨텍스트 객체를 반환합니다. 둘째로, 10.4에서'NSPersistentStore'는 불투명합니다. 당신이'persistentStore'에 대한 코디네이터를 질의 할 때, 당신은'id'를 돌려받을 것입니다. – iluvcapra

관련 문제