목표-C에서 메서드 오버로드?
제가 알기로는 Objective-C는 메서드 오버로드를 지원하지 않습니다.목표-C에서 이에 대한 대안은 무엇입니까?아니면 항상 다른 메소드 이름을 사용해야 합니까?
맞습니다. 목표-C는 메서드 오버로드를 지원하지 않으므로 다른 메서드 이름을 사용해야 합니다.
그러나 "method name"에는 method signature 키워드(":"s" 앞에 오는 매개 변수 이름)가 포함되므로 다음은 둘 다 "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));
목표-C에서는 오버로딩이 지원되지 않는다는 David의 말이 맞습니다.그런 점에서 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
'programing' 카테고리의 다른 글
Mongoose, 찾기, 특정 속성 반환 (0) | 2023.05.21 |
---|---|
DBef를 사용하여 mongodb를 쿼리하는 방법 (0) | 2023.05.21 |
Cygwin에 Pip-3.2 설치 (0) | 2023.05.21 |
'마이크로소프트.SqlServer.Azure에서 Types 버전 10 이상을 찾을 수 없습니다. (0) | 2023.05.21 |
장고 - 해당 테이블 없음: 주.auth_user__old (0) | 2023.05.21 |