Objective-C의 메소드 구문


176

누군가 나를 위해이 메소드 선언 구문을 설명 할 수 있습니까? 이 함수에서 UIPickerView (iPhone의 슬롯 머신 UI)의 행 수가 리턴됩니다. 내 이해 pickerView에서이 방법은 ' '이며 NSInteger를 반환합니다.

pickerView먼저 ' '... 라는 UIPickerview에 대한 포인터를 전달합니다 . 왜 메소드가 매개 변수와 동일한 이름을 사용합니까?

다음으로 component라고하는 NSInteger 파라미터가 있는데, 어떤 컴포넌트가 행을 계산하는지 알려줍니다. 메소드 본문에있는 것을 결정하는 논리입니다.

'는 무엇입니까 numberOfRowsInComponent? 우리가 반환하는 가치를 설명하는 것처럼 보이지만 매개 변수의 중간에 있습니다.

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component
{
    if (component == kStateComponent)
        return [self.states count];

    return[self.zips count];
}

답변:


358

Objective-C 방법은 자체 문서화되도록 설계되었으며 스몰 토크의 풍부한 전통을 활용합니다.

나는 당신이 여기있는 것을 설명하려고 노력할 것 -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component입니다.

  • - (NSInteger)
    이 첫 번째 부분은 이것이 NSInteger 객체를 반환 하는 Objective C 인스턴스 메소드 임을 나타냅니다 . -(대시)이이 있음을 나타냅니다 인스턴스 A는 방법 +이이 있음을 나타냅니다 클래스 방법. 괄호 안의 첫 번째 값은 메소드의 리턴 유형입니다.

  • pickerView:
    이 부분은 메시지 이름 의 일부입니다 . 전체 메시지 이름 이 경우입니다 pickerView:numberOfRowsInComponent:. Objective-C 런타임은이 메소드 정보를 가져 와서 지정된 수신자에게 보냅니다. 순수한 C에서는 다음과 같습니다
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component). 그러나 이것은 Objective-C이므로 추가 정보가 메시지 이름에 압축되어 있습니다.

  • (UIPickerView*)pickerView
    이 부분은 입력의 일부입니다 . 여기서 입력은 유형 UIPickerView*이며 로컬 변수 이름이 pickerView입니다.

  • numberOfRowsInComponent:
    이 부분은 메시지 이름 의 두 번째 부분입니다 . 여기에서 볼 수 있듯이 메시지 이름이 분할되어 수신자에게 전달할 정보를 나타냅니다. 따라서 변수 foo 및 bar를 사용하여 myObject 객체에 메시지
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    를 보내려면 C ++ 스타일과 반대로 다음 과 같이 입력 하십시오
    myObject.pickerView(foo, bar);.

  • (NSInteger)component
    이것은 입력 의 마지막 부분입니다 . 여기서 입력은 유형 NSInteger이며 로컬 변수 이름은 component입니다.


18
좋은 답변을 얻으려면 +1하십시오. "+"가 공식적으로 클래스 메소드를 나타 내기 때문에 첫 번째 지점에서 "factory"를 "class"로 변경하는 것이 좋습니다. 많은 "+"메소드가 팩토리 메소드이지만, 올바른 정의는 아닙니다.
e.James

2
감사! 한 가지 추가 질문 : 다음과 같이 변수 foo 및 bar를 사용하여 myObject 객체에 메시지를 표시하려는 경우 : [myObject pickerView : foo numberOfRowsInComponent : bar]; pickerView는 메소드 이름 또는 매개 변수를 참조합니까?
Craig

2
둘 다. 메소드 이름과 매개 변수를 모두 참조하는 것이 좋은 스타일이지만 전체 메소드 이름은 실제로 pickerView : numberOfRowsInComponent :입니다. pickerView :를 호출하려고하면 메소드가 존재하지 않으므로 런타임 오류가 발생합니다.
locriani

1
pickerView : 부분 자체는 다음 매개 변수를 참조하여 올바른 코딩 스타일을 따라야합니다. 그러나 메소드 이름의 1/2에 불과합니다. 더 좋은 예는 [myObject setX : foo Y : bar] 일 수 있으며, 여기서 메소드는 setX : Y :입니다.
locriani

1
나는이 답변이 오래된 답변이라는 것을 알고 있지만 지난 몇 년 동안 .NET 세계에 살았습니다. Objective C를 처음 사용하고 웹 세계에서 모바일 산업으로 전환하고 있습니다. 질문과 관련이있는 잘 설명 된 설명에 감사드립니다. +1
d3v1lman1337

52

Objective-C에서 메소드 이름은 인수 및 유형이 아닌 선언의 모든 부분으로 구성됩니다. 따라서이 방법의 이름은 다음과 같습니다.

pickerView:numberOfRowsInComponent:

이 방법은 다음과 같은 C 스타일 함수와 동일합니다.

편집 : ( Jarret Hardie 덕분에 ) :

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

1
+1-좋은 간단한 설명. "NSInteger pickerViewNumberOfRowsInCompoent (UIPickerView * pickerView, NSInteger 구성 요소)
Jarret Hardie

나는 당신의 설명을 좋아합니다 .C로 다시 쓰는 것이 훨씬 좋습니다.
lcc

30

이전 답변에 덧붙여 Objective-C 메서드 (또는 원하는 경우 메시지)에 외부내부 가 있다고 말하고 싶습니다. 매개 변수 이름 .

따라서이 경우 :

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component

numberOfRowsInComponent외부 에서이 메소드를 호출 할 때 사용 하는 외부 이름입니다.

그리고 component는 IS 내부 매개 변수 이름이며 메서드 내부에서 매개 변수를 참조하는 데 사용됩니다.

희망이 조금 있습니다.


1
설명에 따라 메소드 이름은 첫 번째 매개 변수의 외부 이름으로 간주 될 수 있습니다. 이것은 또한 wilczarz의 코멘트와 맞습니다.
Jake

젠장, 나는이 대답이 너무 잘못되었다는 것을 알았습니다. 매개 변수의 외부 / 내부 이름과 같은 것은 없습니다. TYPE과 VARIABLE 식별자입니다. 왜 모든 사람들이 ObjC를 자연 언어로 정의하려고 노력하는지 궁금합니다. 그것의 언어, 즉, 그것은 주위에 멋진 단어를 사용하지 않고 그것을 배울 수 있습니다.
Siddharth

인수는 내부 / 외부 이름을 가질 수 있습니다. 사실입니다.
lcc

21

Objective-C 메서드 서명은 문장과 더 비슷합니다. 각 매개 변수는 메소드 이름의 일부를 가질 자격이 있습니다. 예를 들어, C 에서는 person에 관한 정보를 설정 하는 메소드 ( setPersonData )를 가질 수 있습니다 .

void setPersonData( char* name, int age, float height ) {

대물-C에있어서 더 설명 (것이다 : andAge : setPersonName를 andHeight : ) 등

- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {

8
그리고 왜 setPersonalData (char * andName, int alsoAge, float alsoHeight)가 의미가 없습니까? 구문에 대해 이해하는 것에 대한 모든 것, 여기에 objc 디자이너의 의도에 대해서는 아무것도 없습니다. 그들은 솔직히 말이되지 않는 많은 문법을 추가했습니다 .. :)
Siddharth

5
당신은 내가 두려워하는 대답을 오해했습니다. setPersonalData (char * andName, int alsoAge, float alsoHeight)는 호출이 아닌 서명입니다. 이 함수의 호출은 setPersonData ( "Tom", 25, 175)입니다. 그렇게 많이 말하지 않습니까? Obj-C 호출은 다음과 같습니다 : [person setPersonName : @ "Tom"andAge : 25 andHeight : 175];
wilczarz

3
이제 생각해 보니, 나의 대답은 진술보다 불만입니다. 더 동의 할 수 없었습니다.
Siddharth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.