2012-04-27 9 views
10

私は現在、objective-cとiOSプログラミングを学んでいて、この微妙なエラーのために1時間の間は動作しないコードに固執していました。 次のコードを考えてみましょう:一見メソッド名が空です。これは実際に何をしていますか?

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

を(そして新しい誰のため)これはnameプロパティのオーバーライドされたゲッターのように見えます。しかし、非常に微妙なが存在するはずはありません。コンパイラ/パーサ/ランタイムからの警告/エラーはここにありませんので、私の質問は実際にはどうなるのでしょうか?

私はエラーを見た後、このメソッドを呼び出す方法を考え出しましたが、私のいくつかの試みでは成功しませんでした。以下まで

答えて

13

メソッドシグネチャ- (NSString *):nameブレーク:

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

タイプを指定しない場合は、コンパイラはあなたがidを意味想定しているので、この方法は、実際にこの方法の有効な呼び出しは次のようになり- (NSString *):(id)hello

であることがfleshes:[self :@"hello"]

:はメソッドの有効な名前であり、コンパイラはidと仮定しているので、本当に奇妙なことができます。あなたが本当に欲しかったのであれば、- :::という方法があります。コンパイラは、タイプidのオブジェクトを返し、タイプがidの3つのパラメータを受け取るメソッド- (id):(id):(id):(id)を意味すると仮定します。 [self :@"hello" :anObject :myObject];

+3

+1「このメソッドの名前を話したければ、それは単純にコロンと呼ばれます。 – Perception

+0

実際には、メソッド名は「空文字列」です。メソッド名を言うとき、あなたは一般的にコロンを言うことはありません、彼らはそこにいるにもかかわらず...混乱して、私は知っています...しかし、それはちょっと英語のように "、"です。ポーズまたはコネクタですが、話されません。 – bbum

+0

@bbum実際にAppleは、方法を言う正式な方法はすべてのコロンを言うことだと言います。今すぐドキュメントの行を探してください... –

3

投稿したものがまれである(と貧弱なスタイル、imo)という宣言方法です。 Objective-Cは冗長であると考えられています。方法は次のように分類されます。

  1. 先頭文字:-または+です。 -はそれがインスタンスメソッドであることを意味し、+はそれがクラスメソッドであることを意味します。
  2. 括弧内の値:メソッドの戻り値の型。あなたの例では、このメソッドは(NSString *)を返します。
  3. 残りの部分(中括弧の前)は、メソッド名とそれらが取るパラメータです。パラメータなしの名前を持つことができます。その場合、メソッド名には:が含まれません。 such as - (void) reload;これは値を返さず、パラメータを取らないメソッドです。
  4. メソッドがパラメータを受け取る場合、それらはメソッド名に混在し、通常は型を宣言します(あなたの例とは異なります)。例:- (NSString *) reverseString:(NSString *) stringToReverse;この例では、メソッド名はreverseString:になります。メソッド定義にと呼ばれるNSString*という1つのパラメータをとります。
  5. 通常、型なしの:が表示された場合、- (float) addThreeValues:::のようになります。このメソッドはfloatを返し、3つのパラメータを取ります。これは適切な定義です.3つの値は、単に追加するだけなので、どのような順序で指定してもかまいません。