9

instancetypeおよび関連するメソッドの戻り値として使用initすることを推奨する方法です。 最新のclang 機能を参照してください。copyWithZone:ただし、NSCopyingプロトコルの戻り値に関するベスト プラクティスは何ですか (以前のベスト プラクティスについては、このスレッドを参照してください)。clang の記事のメソッドの命名スキームからクラスを推論するためのルールには言及されていませんが、メソッドの戻り値とは異なる必要がある理由がわかりませんalloc

copy-methodsの型推論は機能しませんか? それでも返すinstancetype必要がありますか、それとも実際に返す特定のクラス型ですか?

4

2 に答える 2

16

を使用しないでくださいinstancetype。ここでの明らかなケースは、不変/可変の区別があることです. an の Acopyは、不変として扱うべきNSMutableStringan を返します。NSStringその場合、API は受信側と同じ型のインスタンスを返しません。

もう 1 つの理由は、Josh Caswell が指摘したように (+1)、宣言の署名を一致させる必要があるためです。

もちろん、必要なセマンティクスと署名を使用して独自のプロトコルを宣言することを妨げるものは何もありません。

于 2013-10-10T21:14:49.363 に答える
4

あなたは宣言していませんcopyWithZone:; それはすでにプロトコルによって宣言されており、クラスがプロトコルに準拠していると言う場合は、既存の宣言も採用します。その宣言はid、戻り値の型として使用します。

もちろん、メソッドを実装するときに戻り値の型を書き留める必要がありますが、コンパイラは型チェックを行うときに、定義ではなく宣言を使用しています。

私が知る限り、 *instancetypeとは「互換性がある」idので、それを定義に記述できますが、厳密には、宣言とまったく同じ型を使用するのが最善であると思います。

したがって、 を使用しますid


*つまり、Clang は戻り値の型としてcopyWithZone:で定義されていることに文句を言いません。instancetype

于 2013-10-10T20:05:45.550 に答える