iOS基礎:description方法重寫
阿新 • • 發佈:2019-01-03
一、介紹
description方法是NSObject類的一個例項方法,因此所有的Object-C物件都有description方法。description方法返回的永遠是字串。
description方法的作用是列印物件跟Java裡的toString有點類似。對於一個Person類,如果沒有重寫description方法,NSLog(@“%@”,p),輸出的是p的地址,而我們想要的效果是打印出person的成員變數,所以我們可以在Person類裡重寫description方法。
二、應用
新建一個Person類
宣告部分:
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, copy)NSString * name; @property (nonatomic, assign)NSInteger age; -(instancetype)initWithName:(NSString *)name age:(NSInteger)age; @end
實現部分:
-(instancetype)initWithName:(NSString *)name age:(NSInteger)age{
self = [super init];
if (self) {
self.name = name;
self.age = age;
}
return self;
}
建立一個Person物件並列印該物件
輸出的結果為:Person * person = [[Person alloc] initWithName:@"大聖" age:500]; NSLog(@"%@",person);
2016-06-13 11:17:08.231 Description-test[2795:112637] <Person: 0x7f855a607db0>
//這兩個方法是等價的
//NSLog();函式在列印時都會去呼叫物件的description方法。控制檯只能輸出字串。description方法返回的正是字串。
NSLog(@"%@",person);
NSLog(@"%@",[person description]);
輸出結果為:
2016-06-13 11:26:49.772 Description-test[2861:119853] <Person: 0x7f8278c19d90>
2016-06-13 11:26:49.773 Description-test[2861:119853] <Person: 0x7f8278c19d90>
要想列印時獲取自己感興趣的內容需要重寫父類的description方法-(NSString *)description{
NSString * string = [NSString stringWithFormat:@"<Person: name = %@ age = %ld>",self.name,self.age];
return string;
}
此時的輸出結果為:
2016-06-13 11:30:58.330 Description-test[2913:122828] <Person: name =大聖 age = 500>
三、重寫字典的descriptionWithLocal:(id)local indent:(NSUInteger)level方法
重寫description方法是不管用的。
需要給字典新增分類,在分類的.m檔案中重寫即可。不需要在.h檔案中宣告
-(NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level{
//初始化可變字串
NSMutableString *string = [NSMutableString string];
//拼接開頭[
[string appendString:@"["];
//拼接字典中所有的鍵值對
[self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[string appendFormat:@"%@:",key];
[string appendFormat:@"%@\\",obj];
}];
//拼接結尾]
[string appendString:@"]"];
return string;
}