Objective-C에서 메소드 오버로드?


131

내가 아는 한 Objective-C는 메소드 오버로드를 지원하지 않습니다. Objective-C에서 이에 대한 대안은 무엇입니까? 아니면 항상 다른 메소드 이름을 사용해야합니까?

답변:


193

맞습니다. objective-C는 메소드 오버로드를 지원하지 않으므로 다른 메소드 이름을 사용해야합니다.

그러나 "메소드 이름"에는 메소드 서명 키워드 ( ":"앞에 오는 매개 변수 이름)가 포함되므로 다음은 둘 다 "writeToFile"을 시작하더라도 두 가지 다른 메소드입니다.

-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;

두 메소드의 이름은 "writeToFile : fromInt :"및 "writeToFile : fromString :"입니다.


4
@RaheelSadiq 메소드 이름 (ObjC : 'selectors')이 다르기 때문에 오버로드되지 않습니다. 다르므로 어느 쪽도 '과부하'로 간주되지 않습니다. writeToFile : from :이 매개 변수 유형 만 다른 두 번 정의 된 경우 오버로드됩니다. 언급 한 바와 같이, 이것은 Java 및 현재 Swift를 포함한 다른 언어에서와 같이 ObjC에서 지원되지 않습니다.
Chris Hatton

매개 변수 이름뿐만 아니라 콜론도 메소드 이름의 일부이므로-(void) writeToFile : (NSString *) path : (int) anInt; -(void) writeToFile : (NSString ) path : (NSString ) aString;도 다른 방법입니다.
Kaiserludi

22

Objective-C가 메소드 오버로드를 지원하지 않더라도 Clang + LLVM은 C에 대한 함수 오버로딩을 지원 합니다 . 구현 약간 해킹 (캡슐에 반하는) 버전방문자 디자인 패턴 )

다음은 함수 오버로딩 작동 방식에 대한 간단한 예입니다.

__attribute__((overloadable)) float area(Circle * this)
{
    return M_PI*this.radius*this.radius;
}

__attribute__((overloadable)) float area(Rectangle * this)
{
    return this.w*this.h;
}

//...
//In your Obj-C methods you can call:
NSLog(@"%f %f", area(rect), area(circle));

하나는 방법 스위 즐링과 결합이 힌트는, 실제로 사람이 함께해야하는 이유 "overloadable"방법 ...로 이어질 수 있다고 생각 id하고 isKindOfClass:사람의 처분에하지만, 다른 이야기입니다 ...
알렉스 그레이

1
@alexgray 난 당신의 지점을 참조 id하고 isKindOfClass:가장 실용적인 시나리오를 다룹니다. 오버로드를 선호하는 한 가지 이유는 가장 구체적인 유형을 자동으로 선택하기 때문에 명시적인 유형 검사를 유지하기 위해 약간의 오버 헤드가 발생하기 때문입니다.
Chris Hatton

1
Clang 문서에는 C에 대한 C ++ 이름 맹 글링 기능이 있다고 명시되어 있습니다. 기본적으로 컴파일러는 Objective-C에서 수행하는 작업을 자동으로 수행합니다 (더 긴 형식으로) 인수 타입
Chris Stratton

19

David는 Objective-C에서 메소드 오버로드가 지원되지 않는다는 점에서 정확합니다. 그런 의미에서 PHP와 비슷합니다. 그가 지적했듯이, 그가 예시 한 방식으로 다른 서명을 가진 두 개 이상의 방법을 정의하는 것이 일반적입니다. 그러나 "id"유형을 사용하여 하나의 메소드를 작성할 수도 있습니다. "id"유형을 통해 모든 객체 (및 NSNumber 클래스를 사용하는 프리미티브)를 메소드로 전송 한 다음 메소드 자체에서 해당 유형을 테스트하고 필요한 경우 적절한 예외를 처리 할 수 ​​있습니다. 성능이 약간 저하되지만 대량의 데이터를 처리하지 않는 한 명목상 또는 중요하지 않을 수 있습니다.

- (void) writeToFile: (NSString *)path fromObject: (id)object {
    if (!([object isKindOfClass: [NSNumber class]] || [object isKindOfClass: [NSString class]])) {
         @throw [NSException exceptionWithName: @"InvalidArgumentException" reason: @"Unrecognized parameter type." userInfo: nil];
    }
}

또한 다음과 같이 수행 할 수있는 객체 유형을 적용하기위한 프로토콜을 구현하기에 좋은 곳입니다.

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