[NSString stringWithFormat]メソッドが型を返すのはなぜidですか?私が期待している名前からNSString、一般的なポインタではなく、が返されます。他のクラスはこの「ルール」に従います。たとえば、ではなく、を[NSNumber numberWithInt]返します。NSNumberid
ファクトリメソッドのようなものであるという事実からも正当化されていないと思います。
[NSString stringWithFormat]メソッドが型を返すのはなぜidですか?私が期待している名前からNSString、一般的なポインタではなく、が返されます。他のクラスはこの「ルール」に従います。たとえば、ではなく、を[NSNumber numberWithInt]返します。NSNumberid
ファクトリメソッドのようなものであるという事実からも正当化されていないと思います。
あなたが言うNSNumberには、これには直接のサブクラスがないのでnumberWithInt:、NSNumber*
NSString*(およびなどの他のクラス)は、このメソッドを継承するサブクラス(およびそれぞれ)を持つことができるため、NSSetタイプを返します。そのため、これらの継承された呼び出しはサブクラスの型のインスタンスを返す必要があり、メソッドの命名規則により、戻り型のみに基づいてオーバーロードすることはできません。そのため、それらすべてに共通のタイプ、つまり。が必要です。idNSMutableStringNSMutableSetid
更新:最近の開発は、キーワードinstancetypeが利用可能になったことを意味します。idへの参照の多くがに置き換えられていることに気付いたかもしれませんinstancetype。このキーワードは、メソッドの戻り型がメソッドのレシーバーと同じクラスであるというヒントをコンパイラーに提供します。
たとえば(そして私は例を強調しますが、これは実際のフレームワークには当てはまらないかもしれません):
NSArray:
- (instancetype)initWithArray:(NSArray*)array;
NSMutableArray:
// Inherits from NSArray
----
// Receiver is NSArray, method belongs in NSArray, returns an NSArray
[[NSArray alloc] initWithArray:@[]];
// Receiver is NSMutableArray, method belongs in NSArray, returns an NSMutableArray
[[NSMutableArray alloc] initWithArray:@[]];
これはクラスNSStringの静的メソッドであり、呼び出されているオブジェクトのタイプを返すと想定されているためです。これはNSMutableStringから取得できるため、これもタイプによって異なります。