10

私は現在、objective-c と iOS プログラミングを学んでいますが、この微妙なエラーが原因で 1 時間、動作しないコードで立ち往生していることに気付きました。次のコードを検討してください。

@property (strong, nonatomic) NSString *name;
- (NSString *):name { return @"Some name"; }

一見すると (そして初めての人には)、これはnameプロパティのオーバーライドされた getter のように見えます。しかし、非常に微妙なことがあります。それはあるべきではありません。ここでは、コンパイラ/パーサー/ランタイムから警告/エラーが発生しないため、私の質問は、これが実際にどうなるかです。

エラーが表示されたら、このメソッドを呼び出す方法を見つけようとしましたが、何度か試みても成功しませんでした。

4

2 に答える 2

13

メソッドシグネチャ- (NSString *):nameは次のように分類されます。

  • -これはインスタンスメソッドです(クラスメソッドとは異なります+)。
  • (NSString *)文字列を返します。
  • :このメソッドの名前を話す場合、それは単に「コロン」と呼ばれます。:メソッドが1つのパラメーターも受け入れることをコンパイラーに通知します。
  • namenameというパラメータがあります。

タイプを指定しない場合、コンパイラはあなたが意図idしたものと見なすため、このメソッドは実際には次のようになります。- (NSString *):(id)hello

このメソッドの有効な呼び出しは次のようになります[self :@"hello"]

:はメソッドの有効な名前であり、コンパイラはを想定しているため、非常に奇妙なことができますid。本当に必要な場合は、と呼ばれるメソッドを使用できます- :::- (id):(id):(id):(id)コンパイラーは、型のオブジェクトを返し、型idの3つのパラメーターを受け取るメソッドであると想定しますid。あなたはそれをそのように呼ぶでしょう:[self :@"hello" :anObject :myObject];

于 2012-04-27T22:45:44.540 に答える
3

あなたが投稿したようなメソッド宣言はまれです(そしてスタイルが悪い、imo)。Objective-C は冗長であると想定されています。メソッドは次のように分類されます。

  1. 最初の文字:-または+. -インスタンスメソッドである+ことを意味し、クラスメソッドであることを意味します。
  2. 括弧内の値: メソッドの戻り値の型。あなたの例では、メソッドは(NSString *).
  3. 残り (中括弧の前) は、メソッド名とメソッドが取るパラメータです。パラメータのない名前を持つこともできます。その場合、メソッド名には が含まれません:。Thisなど- (void) reload;は、値を返さず、パラメーターをとらないメソッドになります。
  4. メソッドがパラメーターを受け取る場合、それらはメソッド名に混在し、通常は型を宣言します (例とは異なります)。この- (NSString *) reverseString:(NSString *) stringToReverse;例では、メソッド名reverseString:は 1 つのパラメーターを取り、メソッド定義NSString*で呼び出されます。stringToReverse
  5. 通常、:タイプのない が表示された場合は、次のようなケースになり- (float) addThreeValues:::ます。このメソッドは float を返し、3 つのパラメーターを受け取ります。これは適切な定義です。3 つの値を追加するだけなので、提供される順序は関係ありません。
于 2012-04-27T22:57:13.493 に答える