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().

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];
}

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];
}

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.


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.


1

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

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.