Objective-C에서 여러 매개 변수를 전달하려면 어떻게합니까?


178

Objective-C 메서드 구문에 대한 몇 가지 게시물을 읽었지만 메서드의 여러 이름을 이해하지 못하는 것 같습니다.

getBusStopswith NSStringNSTimeIntervalparameters 및 반환 유형 의을 (를) 호출하는 메서드를 만들려고합니다 NSMutableArray. 이것이 내가 메소드를 구성한 방법이지만 런타임에 분명히 오류가 발생합니다.

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

방법이있는 또 다른 예를 보았습니다.

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

이 메소드에 왜 각 매개 변수의 메소드 이름이 있는지 이해가되지 않습니다. 다음과 같은 작업을 수행해야합니다.

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval

답변:


120

Objective-C에는 명명 된 매개 변수가 없으므로 콜론 왼쪽의 모든 것은 메소드 이름의 일부입니다. 예를 들어

getBusStops: forTime:

메소드의 이름입니다. 이름이 더 잘 설명되므로 더 설명하기 쉽습니다. 당신은 단순히 방법의 이름을 지정할 수 있습니다

getBusStops: :

그러나 그것은 두 번째 매개 변수에 대해 많이 알려주지 않습니다.


157

최소한 각 매개 변수 이름을 ":"으로 구분해야합니다. 기술적으로 이름은 선택 사항이지만 가독성을 위해 권장됩니다. 그래서 당신은 쓸 수 있습니다 :

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

또는 당신이 제안한 것 :

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;

15
+1 : Objective-C 함수 인수는 실제로 이름이 지정되지 않은 위치이므로 레이블은 선택 사항이며 사람이 소비합니다.
Jarret Hardie

왜 서명에서 "forTime"이 선호되는지 잘 모르는 경우 "timeInterval"을 함수의 두 번째 매개 변수로 사용할 수 있습니까?
galactica

@galactica-물론, 그 이름은 당신에게 가장 합리적 일 수 있습니다. 이 예에서는 일관성을 위해 OP의 용어를 사용합니다.
EM

2
아직도 무엇이 forTime사용 되는지 잘 모르 시겠습니까?
mrgloom

71

예; Objective-C 메소드 구문은 몇 가지 이유로 이와 같습니다. 이 중 하나는 지정하는 매개 변수가 무엇인지 명확하게하기위한 것입니다. 예를 들어 NSMutableArray특정 색인에 객체를 추가하는 경우 다음 방법을 사용하여 수행합니다.

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

이 방법을 호출 insertObject:atIndex: 되고 오브젝트가 지정된 인덱스에 삽입되고 있음이 분명합니다.

실제로 "Hello, World!"라는 문자열을 추가하면 NSMutableArray호출 된 인덱스 5에서 array다음과 같이 호출됩니다.

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

또한 메소드 매개 변수 순서 사이의 모호성을 줄여서 오브젝트 매개 변수를 먼저 전달한 다음 색인 매개 . 이는 많은 수의 인수를 사용하는 함수를 사용할 때 더 유용하며 인수 전달시 오류를 줄입니다.

또한 Objective-C는 오버로딩을 지원하지 않기 때문에 메소드 명명 규칙이 적용됩니다. 그러나 동일한 작업을 수행하지만 다른 데이터 유형을 사용하는 메소드를 작성하려는 경우이를 수행 할 수 있습니다. 예를 들어 NSNumber수업을 들으십시오. 여기에는 다음과 같은 여러 가지 객체 생성 방법이 있습니다.

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

C ++와 같은 언어에서는 단순히 숫자 메소드를 오버로드하여 다른 데이터 유형을 인수로 전달할 수 있습니다. 그러나 Objective-C에서이 구문을 사용하면 함수의 각 변형에 대한 메소드 이름을 변경하여 동일한 함수의 여러 변형을 구현할 수 있습니다.


함수 이름에 매개 변수 이름이 포함 된 경우 메소드 호출 (메시지 전송) 중에 매개 변수 이름이 필요합니까?
Naveen

24

각 매개 변수 앞의 텍스트 는 메소드 이름의 일부 입니다. 귀하의 예에서 메소드의 이름은 실제로

-getBusStops:forTime:

각 : 인수를 나타냅니다. 메소드 호출에서 메소드 이름은 : s로 분할되고 인수는 : seg 뒤에 나타납니다.

[getBusStops: arg1 forTime: arg2]

3
메소드 이름을 추가하는 것을 잊었다 고 생각합니다.
Özgür

11

메소드 작성의 경우 :

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

메소드를 호출하십시오.

[mymethods:self.contoCorrente withsecond:self.asecond];

-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

나를:

(returnTypeOfSecontArgument) secondArgumentName ;

다른 언어에서와 같이 다음 구문 void를 사용 add(int one, int second) 하지만 인수를 할당하는 방법은 OBJ_c위에서 설명한 것과 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.