9

その変数を非表示にすることなく、Objective-Cのインスタンス変数と同じ名前のパラメーターをメソッドに与える方法はありますか?

例えば、

- (void)doSomething:(id)object
{
    self.object = object;
}

上記のコードは、「'オブジェクト'のローカル宣言はインスタンス変数を非表示にします」という警告を出します。

明らかな解決策は、パラメーター引数に別の名前を付けることですが、「object」ではなく「anObject」のような名前を選択する必要があるのは面倒です。

4

2 に答える 2

13

のようなことができるかもしれませんself->object = objectが、Objective-Cの規則(Smalltalkから派生)では、パラメーターがインスタンス変数と同じ名前の場合、パラメーターの前に「a」または「an」を付けます。

于 2009-08-11T02:50:29.083 に答える
8

ドット表記を使用してプロパティにアクセスできますが(例のように)、インスタンス変数にはアクセスパスが1つしかないため、インスタンス変数とローカル変数の両方にアクセスする場合の唯一の解決策は、それらに異なる名前を付けることです。

正式に言えば、これはラムダ計算でのアルファ変換の制限に関連しています。具体的には、束縛変数は束縛されたままであり、自由変数は自由のままである必要があります。

ローカルの「an」プレフィックスが気に入らない場合は、インスタンス変数に「_」プレフィックス規則を使用できます。これは、インスタンス変数も効果的に保護された変数であるためです。

@interface AClass {
    id _object;
}
@property (retain) id object;
@end

@implementation AClass
@synthesize object = _object;

- (void)doSomething:(id)object
{
    [_object befriend:object];
}
...

もちろん、「_」は「my」と読み替えられるので、パラメータの前の「a」/「an」と同じくらい不快かもしれません。インスタンス変数とローカル変数には異なる役割があり、それらの名前はこれを反映している必要があるため、名前の変更が最善の解決策です。

于 2009-08-11T03:04:16.563 に答える