2012-11-07 18 views
5

[NSString stringWithFormat]のメソッドがidタイプを返すのはなぜですか?私が期待している名前からは、NSStringを返します。一般的なポインタではありません。他のクラスもこの "ルール"に従います。たとえば、[NSNumber numberWithInt]は、idではなく、NSNumberを返します。NSString stringWithFormat戻り値の型、なぜ "id"ですか?

ファクトリメソッドのような事実からも正当化されていないと私は考えます。

+1

例えば

(及びIは、例えばストレス、これは実際のフレームワークにおける場合ではないかもしれません)。 'NSMutableString'はその場合にキャストが必要です。 –

+0

ええ、私は同意します - なぜそれがそれであるのかということについてタップダンスをすることはできますが、最終的にそれは意味をなさない。 –

答えて

6

あなたはNSMutableStringnumberWithInt: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:@[]]; 
+0

[NSMutableString stringWithFormat]を呼び出すことはできませんでした。通常、私は空のNSMutableStringを構築してから、フォーマットを追加します。クラス階層の私の理解は、StringがStringBuilderのスーパークラスではないJavaの経験から偏っています。 – giampaolo

+0

クラスの変更可能なバージョンは、常にそれの具体的な対応物のサブクラスです。それはココアにとって意味があります。変更可能なクラスはコンクリートと同じですが、読みとりの代わりに読み書きができるようにいくつかのベルとホイッスルが追加されています:) – WDUK

+0

@WDUKは厄介です。NSNumberはクラスクラスターです。それは多くのサブクラスを持っています、ただ彼らはプライベートです。 –

5

これはNSStringクラスの静的メソッドであり、呼び出されるオブジェクトの型を返すものとみなされます。これはNSMutableStringから来る可能性があるので、型にも依存します。

関連する問題