Quel est l'équivalent en Objective-C de «toString ()», à utiliser avec NSLog?


170

Existe-t-il une méthode que je peux remplacer dans mes classes personnalisées afin que lorsque

      NSLog(@"%@", myObject) 

est appelé, il imprimera les champs (ou ce que je juge important) de mon objet? Je suppose que je recherche l'équivalent Objective-C de Java toString().

Réponses:


250

C'est la descriptionméthode d'instance, déclarée comme:

- (NSString *)description

Voici un exemple d'implémentation (merci à grahamparks):

- (NSString *)description {
   return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
}

5
Notez que si vous utilisez CoreData, la descriptionpropriété est réservée ... et fournira des informations de débogage utiles! Dans ce cas, vous devrez créer votre propre nom de méthode unique.
Nuthatch

Est debugDescriptionégalement réservé? Bien que je pense qu'il DebugDescriptionest censé être utilisé par un débogueur comme LLDB.
MaddTheSane

36

Ajoutez ceci à la @implementationde votre classe Photo:

- (NSString *)description {
   return [NSString stringWithFormat:@"Photo: Name=%@ Author=%@",name,author];
}

24

Vous pouvez remplacer la méthode de description de NSObject:

- (NSString *)description

Au sujet de la journalisation, je recommande ce billet de blog pour une meilleure connexion dans Objective-C.


4
N'est-ce pas une méthode statique? J'aimerais que cela fonctionne sur des objets plutôt que sur la classe. Par exemple, si j'ai une classe "Photo", avec les champs "nom" et "auteur", j'aimerais que NSLog imprime ces champs tels qu'ils sont assignés dans l'objet.
George Armhold

2
Oui - bien repéré - j'ai appuyé sur la mauvaise touche. Je devrais clairement faire plus attention lors de la relecture de mes réponses. Heureusement, quelqu'un avait l'œil sur la balle :-)
teabot

13

Vous pouvez utiliser deux fonctions.

- (NSString*)description

Cela sera affiché lorsque vous mettez votre objet comme, IE un paramètre pour NSLog. L'autre fonction de description est:

- (NSString*)debugDescription

Cela sera appelé lorsque vous le faites po anInstanceOfYourClassdans la fenêtre de commande de débogage. Si votre classe n'a pas de debugDescriptionfonction, alors juste descriptionsera appelée.

Notez que la classe de base a NSObjectété descriptionimplémentée, mais elle est assez simple: elle n'affiche que l'adresse de l'objet. C'est pourquoi je vous recommande d'implémenter descriptiondans n'importe quelle classe dont vous souhaitez obtenir des informations, en particulier si vous utilisez la descriptionméthode dans votre code. Si vous utilisez descriptiondans votre code, je vous suggère de l'implémenter debugDescriptionégalement, en rendant également debugDescriptionplus verbeux.


1

Cela produira les voix disponibles:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.