0

次のようなメソッドを宣言する他の誰かのコードに出くわしました:

- (void) method:(id)a:(NSString*)b { }

コンパイラは次のコードを受け入れ、警告のみを表示します。

'a' used as the name of the previous parameter rather than as part of the selector

このコードは、このタイプのさまざまな関数を宣言し、署名「methodname::」を使用して NSSelectorFromString を介してそれらを呼び出します。だから、すべてが一貫しています。

そのメソッド シグネチャは単なる間違いなのか、それとも他に何かあるのだろうか。コード内で一貫して使用されているため、これはタイプミスではないと思います。私は作者を知らないので、これが天才のコードなのか、それともその逆なのかわかりません。

'b' は匿名パラメーターですか? (もしそうなら、これをよりよく示すために、「a」と「:」の間に空白を入れて書くべきではありませんか?) ただし、ObjC ドキュメントで anon parms については何も見つかりません。

構文を変更して 2 番目のパラメーターに名前を付け、それに応じて署名参照を修正すると、動作に変化はありますか? 警告を取り除くためにこの変更を行う予定ですが、気付いていない問題を作成する可能性があるのではないかと思います。

4

2 に答える 2

2

あなたが説明することはすべてほとんど正しいです。これは非常に悪いスタイルですが、技術的には、たまたま 2 番目の前にテキストがない 2 つの引数セレクタ:です。bセレクターの名前の一部として、名前の前に説明的なテキストがないだけなので、名前を付けることができるので、匿名の引数を呼び出しません。

はい、おそらく . の後にスペースが必要aです。

名前を変更したい場合は、Xcode の標準の Refactor->Rename 機能を使用して、2 番目の の前にテキストを挿入するだけ:です。すべての参照が更新され、問題は発生しません。

于 2013-04-09T14:09:01.363 に答える
2

ほとんどの人には推奨されていませんが、署名を使用できます。method::各パラメーターを区切る前にスペース文字を挿入するだけ:で、コンパイラーは満足します。

- (void) method:(id)a :(NSString*)b

The Objective-C Programming Language の16 ページ「Message Syntax」では、 これは「ラベルのない引数」または「キーワードのない引数」と呼ばれます。

もちろん、次のように変更できます。

- (void) method:(id)a withB:(NSString*)b

しかし、これはセレクターを に変更しmethod:withB:ます。

于 2013-04-09T14:07:23.483 に答える