web-dev-qa-db-ja.com

Objective-Cのメソッドのオーバーロード?

私の知る限り、Objective-Cはメソッドのオーバーロードをサポートしていません。 Objective-Cでこれに代わるものは何ですか?または、常に別のメソッド名を使用する必要がありますか?

127
suse

正しい、objective-Cはメソッドのオーバーロードをサポートしていないため、異なるメソッド名を使用する必要があります。

ただし、「メソッド名」にはメソッドシグネチャキーワード(「:」の前にあるパラメーター名)が含まれているため、以下は2つのdifferentメソッドであり、どちらも「 writeToFile」:

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

(2つのメソッドの名前は「writeToFile:fromInt:」と「writeToFile:fromString:」です)。

186
David Gelhar

Objective-Cがmethodオーバーロードをサポートしていない場合でも、Clang + LLVMはサポートしている functionCのオーバーロード。探しているものではありませんが、状況によっては役立つことがあります(たとえば、カプセル化) 訪問者の設計パターン )のバージョン

関数のオーバーロードがどのように機能するかの簡単な例を次に示します。

__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));
22
Valentin Radu

Davidは、Objective-Cではメソッドのオーバーロードがサポートされていないという点で正しいです。その意味でPHPに似ています。彼が指摘しているように、例の方法で異なるシグネチャを持つ2つ以上のメソッドを定義するのが一般的です。しかし、 「id」タイプを使用して1つのメソッドを作成します。「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
19
Ziminji