답변:
맞습니다. 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));
id
하고 isKindOfClass:
사람의 처분에하지만, 다른 이야기입니다 ...
id
하고 isKindOfClass:
가장 실용적인 시나리오를 다룹니다. 오버로드를 선호하는 한 가지 이유는 가장 구체적인 유형을 자동으로 선택하기 때문에 명시적인 유형 검사를 유지하기 위해 약간의 오버 헤드가 발생하기 때문입니다.
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