Objective-C Language Le type de retour "instancetype"


Exemple

Objective-C prend en charge un type spécial appelé `instancetype qui ne peut être utilisé que comme type renvoyé par une méthode. Il évalue à la classe de l'objet récepteur.

Considérons la hiérarchie de classes suivante:

@interface Foo : NSObject

- (instancetype)initWithString:(NSString *)string;

@end

@interface Bar : Foo
@end

Lorsque [[Foo alloc] initWithString:@"abc"] est appelé, le compilateur peut en déduire que le type de retour est Foo * . La classe Bar dérivée de Foo mais n'a pas remplacé la déclaration de l'initialiseur. Cependant, grâce à instancetype , le compilateur peut déduire que [[Bar alloc] initWithString:@"xyz"] renvoie une valeur de type Bar * .

Considérez le type de retour de -[Foo initWithString:] étant à la place Foo * : si vous appelez [[Bar alloc] initWithString:] , le compilateur en [[Bar alloc] initWithString:] qu’un Foo * est renvoyé, et non une Bar * développeur. Le type d' instancetype résolu ce problème.

Avant l'introduction de l' instancetype , les initialiseurs, les méthodes statiques telles que les accesseurs singleton et les autres méthodes souhaitant renvoyer une instance de la classe réceptrice devaient renvoyer un id . Le problème est que id signifie "un objet de tout type" . Le compilateur ne peut donc pas détecter que NSString *wrong = [[Foo alloc] initWithString:@"abc"]; attribue une variable avec un type incorrect.

En raison de ce problème, les initialiseurs doivent toujours utiliser instancetype au lieu de id comme valeur de retour.