Objective-C에서 메소드 오버로드?
내가 아는 한 Objective-C는 메소드 오버로드를 지원하지 않습니다. Objective-C에서 이에 대한 대안은 무엇입니까? 아니면 항상 다른 메소드 이름을 사용해야합니까?
올바른 objective-C는 메소드 오버로드를 지원하지 않으므로 다른 메소드 이름을 사용해야합니다.
그러나 "메소드 이름"에는 메소드 서명 키워드 ( ":"앞에 오는 매개 변수 이름)가 포함되므로 다음은 둘 다 "writeToFile"로 시작하더라도 두 가지 다른 메소드입니다.
-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;
두 메소드의 이름은 "writeToFile : fromInt :"및 "writeToFile : fromString :"입니다.
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));
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
참고 URL : https://stackoverflow.com/questions/2286312/method-overloading-in-objective-c
'Programming' 카테고리의 다른 글
| Eclipse에서 최대 절전 모드 도구를 설치하는 방법은 무엇입니까? (0) | 2020.07.03 |
|---|---|
| AngularJS UI 라우터-상태를 다시로드하지 않고 URL 변경 (0) | 2020.07.03 |
| matplotlib을 사용하여 많은 하위 플롯에 대해 단일 범례를 어떻게 만들 수 있습니까? (0) | 2020.07.03 |
| 내 안드로이드 클라이언트에서 힙 업데이트를 활성화하는 방법 (0) | 2020.07.03 |
| `python setup.py install` 의존성 해결을 위해`easy_install` 대신`pip`를 사용할 수 있습니까? (0) | 2020.07.03 |