2013-10-10 18 views
9

L'utilizzo di instancetype come valore di ritorno init e metodi correlati è il modo consigliato di procedere, vedere l'ultima clang features. Tuttavia, qual è la migliore pratica? il valore di ritorno di copyWithZone: nel protocollo NSCopying (vedere this thread per le best practice precedenti)? Non è menzionato nelle regole per dedurre la classe dallo schema di denominazione dei metodi nell'articolo clang, ma non vedo perché dovrebbe essere diverso dal valore di ritorno del metodo alloc.Utilizzare instancetype come tipo di ritorno di una copia in Objective-C?

L'inferenza di tipo non funziona per i metodi copy? Dovremmo ancora restituire instancetype o piuttosto il tipo di classe specifico che effettivamente restituiamo?

risposta

15

NON si consiglia di utilizzare instancetype. Il caso ovvio qui è che esiste la distinzione immutabile/mutevole: A copy di uno NSMutableString restituisce uno NSString che dovresti considerare immutabile. In tal caso, l'API non restituisce un'istanza dello stesso tipo del destinatario.

L'altro motivo è che dovresti abbinare la firma della dichiarazione, come ha notato Josh Caswell (+1).

Naturalmente, nulla ti impedisce di dichiarare il tuo protocollo con la semantica e la firma che desideri.

4

Non stai dichiarando copyWithZone:; è già dichiarato dal protocollo, e se la tua classe dice che è conforme al protocollo, allora adotta anche la dichiarazione esistente. Tale dichiarazione utilizza id come tipo di ritorno.

È necessario scrivere un tipo di ritorno quando si implementa il metodo, ovviamente, ma il compilatore utilizza la dichiarazione, non la definizione, quando esegue il controllo del tipo.

Per quanto ne so, instancetype è "compatibile" con id *, quindi è possibile scriverlo nella definizione, ma a rigor di termini, penso che sarebbe meglio usare lo stesso tipo della dichiarazione.

Pertanto, utilizzare id.


* cioè., Clang non si lamenta copyWithZone: essendo definita con instancetype come tipo di ritorno.