NSLog打印中文以及对打印格式的控制

Swift打印优化与格式控制
本文详细介绍了在Swift中优化NSLog打印中文的方法,通过重写descriptionWithLocale:indent:方法替代旧版的descriptionWithLocale:方法,实现更高效、格式化的打印输出。特别针对NSDictionary和NSArray类进行代码示例,展示了如何控制打印格式,适用于处理大量JSON数据的场景。

以前使用NSLog打印中文就是重写下面的方法.

- (NSString *)descriptionWithLocale:(nullable id)locale;

然而在某个版本(我也记不清楚是什么版本了).这个方法失效了.NSLog不会走这个方法.当时简单的查阅了一下资料就改了…今天看了看一个特别老旧的项目没有输出中文.想到之前改的这个事情了.纯属记录一下吧.
在新版本中使用

- (NSString *)descriptionWithLocale:(nullable id)locale indent:(NSUInteger)level;

来代替之前的方法.

:下面贴出具体代码

@implementation NSArray (Log)

/// old
- (NSString *)descriptionWithLocale:(id)locale {
    NSMutableString *strM = [NSMutableString string];
    [strM appendString:@"(\n"];
    [self enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        //  判断是否是最后一个元素
        if (idx == self.count - 1) {
            [strM appendFormat:@"\t%@\n", obj];
        } else {
            [strM appendFormat:@"\t%@,\n", obj];
        }
    }];
    [strM appendString:@")\n"];
    return strM;
}

/// new
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
    NSMutableString *strM = [NSMutableString string];
    [strM appendString:@"(\n"];
    [self enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        //  判断是否是最后一个元素
        if (idx == self.count - 1) {
            [strM appendFormat:@"\t%@\n", obj];
        } else {
            [strM appendFormat:@"\t%@,\n", obj];
        }
    }];
    [strM appendString:@")\n"];
    return strM;
}


@end


@implementation NSDictionary (Log)

/// old
- (NSString *)descriptionWithLocale:(id)locale {
    NSMutableString *strM = [NSMutableString string];
    [strM appendString:@"{\n"];
    [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        [strM appendFormat:@"\t%@ = %@;\n", key, obj];
    }];
    [strM appendString:@"}\n"];
    return strM;
}

/// new
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
    NSMutableString *strM = [NSMutableString string];
    [strM appendString:@"{\n"];
    [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        [strM appendFormat:@"\t%@ = %@;\n", key, obj];
    }];
    [strM appendString:@"}\n"];
    return strM;
}

@end

拓展:打印格式的控制

- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
    NSMutableString *strM = [NSMutableString string];
    [strM appendString:@"{\n"];
    [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        [strM appendFormat:@"\t%@ = %@;\n", key, obj];
    }];
    [strM appendString:@"}\n"];
    NSInteger levelNum = 0;
    NSUInteger lenth = strM.length;
    for (NSUInteger i = lenth - 1; i > 0; i--) {
        NSString *strCompare = [strM substringWithRange:NSMakeRange(i, 1)];
        if ([strCompare isEqualToString:@"}"] || [strCompare isEqualToString:@")"]) {
            for (NSInteger j = 0; j < levelNum - 1; j++) {
                [strM insertString:@"   " atIndex:i];
            }
            levelNum++;
        } else if ([strCompare isEqualToString:@"{"] || [strCompare isEqualToString:@"("]) {
            levelNum--;
        } else if ([strCompare isEqualToString:@"\n"]) {
            for (NSInteger j = 0; j < levelNum + 1; j++) {
                [strM insertString:@"   " atIndex:i+1];
            }
        }
    }
    return strM;
}

主要是在下面的方法里头进行了打印格式的控制.因为一般打印的回调都是一个Dictionary.所以我偷懒了一下就在NSDictionary的分类里头写了.大家看懂了就行

NSInteger levelNum = 0;
    NSUInteger lenth = strM.length;
    for (NSUInteger i = lenth - 1; i > 0; i--) {
        NSString *strCompare = [strM substringWithRange:NSMakeRange(i, 1)];
        if ([strCompare isEqualToString:@"}"] || [strCompare isEqualToString:@")"]) {
            for (NSInteger j = 0; j < levelNum - 1; j++) {
                [strM insertString:@"   " atIndex:i];
            }
            levelNum++;
        } else if ([strCompare isEqualToString:@"{"] || [strCompare isEqualToString:@"("]) {
            levelNum--;
        } else if ([strCompare isEqualToString:@"\n"]) {
            for (NSInteger j = 0; j < levelNum + 1; j++) {
                [strM insertString:@"   " atIndex:i+1];
            }
        }
    }

注:序列化操作大量json数据的时候(对应到我们App就是我写的购票模块)时间消耗比较大,可以正常操作(release版本屏蔽NSLog)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值