Який еквівалент Objective-C для "toString ()" для використання з NSLog?


170

Чи є метод, який я можу змінити у своїх спеціальних класах, щоб коли

      NSLog(@"%@", myObject) 

буде викликано, він надрукує поля (або все, що я вважаю важливим) мого об'єкта? Я думаю, що я шукаю еквівалент Objective-C Java toString().

Відповіді:


250

Це descriptionметод екземпляра, оголошений як:

- (NSString *)description

Ось приклад реалізації (завдяки граммарк):

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

5
Зверніть увагу, якщо ви використовуєте CoreData, descriptionвластивість зарезервована ... і надасть корисну інформацію про налагодження! У такому випадку вам потрібно буде придумати своє власне унікальне ім'я методу.
Нутч

Є debugDescriptionтакож зарезервований? Хоча я думаю, що DebugDescriptionвін повинен використовуватись налагоджувачем типу LLDB.
MaddTheSane

36

Додайте це до @implementationсвого фотокласу:

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

24

Ви можете перекрити метод опису NSObject:

- (NSString *)description

Щодо теми реєстрації, я рекомендую цю публікацію в блозі для кращого входу в Objective-C.


4
Це не статичний метод? Я хотів би, щоб це працювало на об'єктах, а не на класі. Наприклад, якщо у мене клас "Фото" з полями "ім'я" та "автор", я хотів би, щоб NSLog надрукував ці поля, як вони призначені в об'єкті.
Джордж Армхолд

2
Так - добре помічено - я натиснув неправильну клавішу. Я, безумовно, повинен звернути більше уваги, коли доказ читає мої відповіді. На щастя, хтось
поглянув

13

Ви можете використовувати дві функції.

- (NSString*)description

Це відобразиться, коли ви поставите об'єкт як, IE параметр для NSLog. Інша функція опису:

- (NSString*)debugDescription

Це буде викликано, коли ви зробите це po anInstanceOfYourClassу вікні команди налагодження. Якщо у вашому класі немає debugDescriptionфункції, то він просто descriptionбуде викликаний.

Зауважте, базовий клас NSObjectдійсно descriptionреалізований, але він досить голий: він відображає лише адресу об'єкта. Ось чому я рекомендую вам реалізовувати descriptionв будь-якому класі, з якого ви хочете отримати інформацію, особливо якщо ви використовуєте descriptionметод у своєму коді. Якщо ви все-таки використовуєте descriptionу своєму коді, я пропоную вам також реалізувати debugDescription, також зробивши debugDescriptionбільш багатослівним.


1

Це видасть доступні голоси:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.