1. 程式人生 > >iOS基礎:description方法重寫

iOS基礎:description方法重寫

一、介紹

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