Jaki jest odpowiednik Objective-C dla metody „toString ()” do użytku z NSLog?

170

Czy istnieje metoda, którą mogę zastąpić w moich niestandardowych klasach, aby kiedy

      NSLog(@"%@", myObject) 

nazywa się, wydrukuje pola (lub cokolwiek uznam za ważne) mojego obiektu? Myślę, że szukam odpowiednika języka Java w Objective-C toString().

George Armhold
źródło

Odpowiedzi:

250

Jest to descriptionmetoda instancji, zadeklarowana jako:

- (NSString *)description

Oto przykładowa implementacja (dzięki grahamparks):

- (NSString *)description {
   return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
}
zakovyrya
źródło
5
Uwaga, jeśli używasz CoreData, descriptionwłaściwość jest zarezerwowana ... i zapewni przydatne informacje dotyczące debugowania! W takim przypadku musisz wymyślić własną unikalną nazwę metody.
Kowalik
Czy debugDescriptionteż jest zarezerwowane? Chociaż myślę, że DebugDescriptionpowinien być używany przez debugger, taki jak LLDB.
MaddTheSane
36

Dodaj to do @implementationswojej klasy Photo:

- (NSString *)description {
   return [NSString stringWithFormat:@"Photo: Name=%@ Author=%@",name,author];
}
grahamparks
źródło
24

Możesz zastąpić metodę opisu NSObject:

- (NSString *)description

Na temat logowania polecam ten wpis na blogu, aby lepiej logować się w Objective-C.

imbryk
źródło
4
Czy to nie jest metoda statyczna? Chciałbym, żeby to działało na obiektach, a nie na klasie. Na przykład, jeśli mam klasę „Photo” z polami „name” i „author”, chciałbym, aby NSLog wydrukował te pola tak, jak są przypisane w obiekcie.
George Armhold
2
Tak - dobrze zauważony - nacisnąłem zły klawisz. Wyraźnie powinienem zwracać większą uwagę na korektę moich odpowiedzi. Na szczęście ktoś miał oko na piłkę :-)
teabot
13

Możesz użyć dwóch funkcji.

- (NSString*)description

Będzie to wyświetlane, gdy umieścisz swój obiekt jako, tj. Parametr dla NSLog. Inną funkcją opisu jest:

- (NSString*)debugDescription

Zostanie to wywołane, gdy zrobisz to po anInstanceOfYourClassw oknie poleceń debugowania. Jeśli twoja klasa nie ma debugDescriptionfunkcji, po prostu descriptionzostanie wywołana.

Zauważ, że klasa bazowa NSObjectma descriptionzaimplementowaną, ale jest dość prosta: wyświetla tylko adres obiektu. Dlatego zalecam implementację descriptionw dowolnej klasie, z której chcesz uzyskać informacje, zwłaszcza jeśli używasz descriptionmetody w swoim kodzie. Jeśli używasz descriptionw swoim kodzie, proponuję również zaimplementować, debugDescriptiona także uczynić debugDescriptionbardziej szczegółowym.

MaddTheSane
źródło
1

Spowoduje to wyświetlenie dostępnych głosów:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
grigb
źródło