2012-04-04 1 views
0

나는,메서드에서 선택적 매개 변수 NSInteger를 만들 수 있습니까?

setData:(SomeClassName *)data inPosition:(NSInteger)position 

의 라인을 따라하고 구현하는 방법을이 위치로 전무를 확인하고 싶습니다. 아이디어는 포지션이 제공된다면 사용 하겠지만 그렇지 않다면 자동으로 할당 할 것입니다.

문제는 컴파일러 경고없이 NULL 또는 nil을 전달할 수 없다는 것입니다.

나는이 패턴을 다른 곳에서 보았습니다 (선택적 매개 변수). NSIndexPath와 관련되었을 수도 있습니다.

NSNumber를 래퍼로 사용해야합니까? 아니면 다른 비밀이 있습니까?

별도로, setData : 및 setData : inPosition :이라는 별도의 메서드를 사용하는 방법을 고려했습니다. 그러나 문제는 '데이터'가 핵심 데이터 생성 속성이며 일반 ivar가 아니라는 것입니다. 따라서 실제로 가치를 설정하려면 모든 KVO 메시지를 보내야한다는 것을 기억해야합니다. 예를 들어, setData : withPosition 내에서 표준 setData를 호출 할 수 없습니다. - 위치로 수행 한 작업을 덮어 씁니다.

또한이 두 가지의 '더 나은'해결 방법에 대해 알고 싶습니다.

+0

NSNumber 또는 과부하 사용 – mshsayem

+1

Objective-C에는 과부하가 없습니다. –

답변

3

@ 저스틴의 접근 방식이 일반적으로 가장 적합합니다. 그러나 setData: 및 KVO에 대한 질문에, 몇 가지주의 할 수있다 :

  • KVO 알림은 한 방법이 setFoo:라는 자동으로 전송됩니다. setFoo:을 덮어 쓰더라도 KVO는 속성에 대한 올바른 KVO 알림 호출로 구현을 래핑합니다. 이것은 코코아에서 가장 불가사의 한 것 같습니다. (나는 가장 이상한 일 이었지만, 블록 변수 범위 지정, 특히 블록이 스택에서 힙으로 이동하는 방법에 대해 궁금해하기 시작했습니다. 더 마법적인 것일 수 있습니다.)

  • 핵심 데이터 속성을 직접 설정하고 KVO와 가능한 모든 매직을 우회해야하는 경우 원시 액세서를 사용할 수 있습니다. setPrimitiveData:setData:이 속성을 설정하는 데 사용하는 기본 방법입니다. 프리미티브 접근자를 재정의해서는 안됩니다.


는 @Justin는 그의 대답을 삭제 한 것으로 보인다. 여기에있는 전형적인 해결책은 setData:setData:inPosition:을 선언하는 것입니다 (btw, 독자로서 "inPosition"이 무엇을 의미하는지 알지 못합니다). setData:은 "위치를 파악하는 데 필요한 것을 적용하여 setData:inPosition:이라고 부릅니다."

+0

와우는 마술 적입니다. 누가 알았습니까 (글쎄, 당신은 그랬습니다). 예, KVO에 대해 언급 할 때 setPrimitiveData : 메서드도 포함하기로했습니다. 그래서 기본 setData를 사용자 정의합니다. 위치를 찾아서 setData : inPosition으로 보냅니다. 하지만 setData : inPosition 안에는 실제로 데이터를 설정해야합니다. setData를 사용하여 이렇게하면 : 'position'을 다시 계산하여 setData : inPosition :에 보냅니다. 그러면 차례대로 setData가 사용됩니다. - 아이디어를 얻습니다. 아니면 표준 setData를 사용해서는 안된다고 말하고 있습니까? 실제로 데이터를 설정하고 대신 setPrimitveData :를 사용하십시오. –

+1

수정하십시오. 여기서 한 가지 트릭은 KVO가'setData : inPosition :'에서 올리길 원하는지 여부입니다. 그렇다면, 당신은 그것을 게시하고'setData :'로부터 그것을 억제해야 할 것이다. 당신은'+ automaticallyNotifiesObserversForKey :'를 오버라이드하고'data'를 위해 NO를 반환함으로써 그렇게합니다. –

+0

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-BAJEAIEE –

1

NSNumber 래퍼 사용은 꽤 표준입니다.

물론, -1, NSNotFound를 전달하거나 고유 한 n/a 값을 정의 할 수도 있습니다.

0

이 세 가지 옵션이 있습니다 :에 대한

  1. 패스 -1 또는 일부 예 :"값 없음 "
  2. 사용의 NSNumber의 래퍼에 대한 nil를 통과"값이 없음 "
  3. 과부하

Objective-C 선택적 매개 변수 메커니즘을 사용해 볼 수도 있지만 목록의 끝을 표시하는 일종의 전초 력이 필요하기 때문에 다른 어떤 것보다 좋지는 않습니다.