あなたはNSMutableString
(numberWithInt:
がNSNumber*
NSString*
を返す(そして、そのようなNSSet
など他のクラス)するのが安全ですので、彼らはサブクラスを持つことができるので、これは、戻り値の型id
を任意の直接のサブクラスを持っていない、NSNumber
に言及し、 NSMutableSet
)、このメソッドを継承します。したがって、これらの継承された呼び出しは、サブクラスの型のインスタンスを返す必要があり、メソッドの命名規則のために、戻り値の型だけに基づいてオーバーロードすることはできません。したがって、それらの間に共通タイプ、つまりid
が必要です。
更新:最近の開発では、キーワード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:@[]];
:
例えば(及びIは、例えばストレス、これは実際のフレームワークにおける場合ではないかもしれません)。 'NSMutableString'はその場合にキャストが必要です。 –
ええ、私は同意します - なぜそれがそれであるのかということについてタップダンスをすることはできますが、最終的にそれは意味をなさない。 –