このようにobjective-cメソッドを書くのは正しいですか
-methodA: (NSString *)str // without return type
{
return @"test";
}
上記の方法は私にとってはうまくいきます。 と同じ
ですか?
私はsdkを使用しています。-methodA: (NSString *)str
-(id)methodA: (NSString *)str
Mac 10.5 os x
このようにobjective-cメソッドを書くのは正しいですか
-methodA: (NSString *)str // without return type
{
return @"test";
}
上記の方法は私にとってはうまくいきます。 と同じ
ですか?
私はsdkを使用しています。-methodA: (NSString *)str
-(id)methodA: (NSString *)str
Mac 10.5 os x
「The Objective-C 2.0 Programming Language」からの質問に答えるには:
戻り値または引数の型が明示的に宣言されていない場合、メソッドとメッセージの既定の型 (
id
.
So- methodA:(NSString *)str
は有効で、 と同じです- (id)methodA:(NSString *)str
。
ただし、これは確かに通常とは異なるコーディング方法であり、奨励されるべきではありません - 余分な 4 文字を入力してください!
- (void) methodA (NSString *)str //always start a methodod name lower case
{
return; //If you do not return anything then there is nothing to return.
}
(id)
とは異なり(void)
ます。ここで何かを返す必要があります。id
任意のタイプのオブジェクトを表します。「無」のみvoid
を表します。
アプリで -init を変更しました:
-init
{
...
return self;
}
コンパイラは警告を表示しませんでした。-init を変更すると、次のようになります。
-(int)init
{
...
return 0;
}
コンパイラは予想される型について警告を表示するので、 -init と -(id)init は同じメソッドであると言えます。コンパイラがこの構文を渡すことさえ知らず、そのような言語の機能をチェックすることは悪い習慣だからです:)。Objective-C に関する Apple のドキュメントを読んで、それについて何かを見つけようとします。素敵な質問をありがとう:)
編集:
うわー、あなたはここでドキュメントを読むことができます、クラスインターフェースの章。(void)、(NSObject*) などはキャストのみです。引用:「メソッドの戻り値の型は、ある型を別の型にキャストするための標準 C 構文を使用して宣言されます」. そして別の引用:「戻り値またはパラメーターの型が明示的に宣言されていない場合、メソッドとメッセージの既定の型 (id) であると見なされます」。
言語仕様が示すように、許可されています
戻り値またはパラメーターの型が明示的に宣言されていない場合は、メソッドとメッセージの既定の型 (.an) と見なされます
id
。
コンパイルしても正しくありません。将来の自分を含め、他の開発者の生活が少し難しくなります。
コンパイルして期待どおりに動作する場合は、動作します。しかし、私はそれが良い習慣だとは言いません。
私が推測しなければならないとしたら、あなたのメソッドは何も返さないだろうと思っていたでしょう。したがって、「正しい」とはいえ、誤解を招きます。
本当に任意の型のオブジェクトを返したい場合、余分な 4 文字が問題になるでしょうか? 本当に何も返さない場合は、戻り値の型を に設定しますvoid
。コンパイラを満足させるのは簡単ですが、すべてではありません。
これを行う:
- (void)methodA:(NSString *)str
{
//non returning method;
}
- (NSString *)methodA:(NSString *)str
{
return str; //returning method;
}