不改項(xiàng)目代碼解決YYModel數(shù)字轉(zhuǎn)字符串的精度問題

昨天看到一個(gè)群里的朋友的問題,接手一個(gè)已有項(xiàng)目的歷史遺留bug:項(xiàng)目已經(jīng)完成,代碼量很大,有很多自定義模型類,并且模型類直接存在各種嵌套,之前的模型類所有關(guān)于服務(wù)器返回的數(shù)字都是統(tǒng)一用NSString存儲(chǔ)的,但是后臺(tái)返回的并不是字符串,導(dǎo)致了YYModel字典轉(zhuǎn)模型的時(shí)候,所有模型的字符串都是這樣:

NSDictionary *dict = @{
                       @"fee": [NSNumber numberWithDouble:807.69],
                       @"firend":@{
                               @"fee": [NSNumber numberWithDouble:807.69]
                               }
                       };

后臺(tái)返回的數(shù)字:807.69

// 類似的模型類
@interface Person : NSObject
@property(nonatomic, strong) NSString *fee;
@property(nonatomic, strong) Person *friend;
@end

YYModel字典轉(zhuǎn)模型后的字符串:p.friend.fee = @"807.6900000000001"

修改起來麻煩的情況在于:后臺(tái)有大量的不同字段名的數(shù)據(jù)都是這樣返回的,而且存在模型套模型、模型套模型數(shù)組這些情況,無論是客戶端改模型類的類型,還是后臺(tái)改,都是一個(gè)很大的工作量,需要改項(xiàng)目中特別多的地方,改起來又需要重新依次測(cè)試,非常的耗時(shí)間。

最后我還是想到了一個(gè)最取巧的辦法,不需要去改動(dòng)項(xiàng)目的任何代碼,只需要?jiǎng)?chuàng)建一個(gè)分類文件,用runtime方法交換,在YYModel通過字典給模型賦值數(shù)據(jù)的方法之前,先將字典的NSNumber類型轉(zhuǎn)成不損失精度的NSString,在尾部去0,重新傳給YYModel原來的方法就行了。

只需要將下面這個(gè)分類文件添加到項(xiàng)目中,就可以解決這個(gè)問題。這樣后臺(tái)和客戶端都不需要改任何項(xiàng)目源代碼,實(shí)現(xiàn)了對(duì)項(xiàng)目源代碼的0入侵。

源碼:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSObject (ModelExchange)

@end

NS_ASSUME_NONNULL_END
#import "NSObject+ModelExchange.h"
#import "NSObject+YYModel.h"
#import <objc/runtime.h>

@implementation NSObject (ModelExchange)

+ (void)load {
    Method method1 = class_getInstanceMethod([self class], @selector(yy_modelSetWithDictionary:));
    Method method2 = class_getInstanceMethod([self class], @selector(my_modelSetWithDictionary:));
    method_exchangeImplementations(method1, method2);
}

- (BOOL)my_modelSetWithDictionary:(NSDictionary *)dic {
    NSMutableDictionary *mDictionary = [NSMutableDictionary dictionary];
    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        if ([obj isKindOfClass:[NSNumber class]]) {
            NSNumber *num = (NSNumber *)obj;
            NSNumberFormatter *formatter = [NSNumberFormatter new];
            formatter.numberStyle = NSNumberFormatterDecimalStyle;
            [formatter setGroupingSeparator:@""];
            NSString *str = [formatter stringFromNumber:num];
            [mDictionary setValue:str forKey:key];
        } else {
            [mDictionary setValue:obj forKey:key];
        }
    }];
    return [self my_modelSetWithDictionary:mDictionary];
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,662評(píng)論 1 32
  • 導(dǎo)語:YYModel庫是優(yōu)秀的模型轉(zhuǎn)換庫,可自動(dòng)處理模型轉(zhuǎn)換(從JSON到Model 和 Model到JSON)的...
    南華coder閱讀 5,598評(píng)論 0 11
  • 寫代碼時(shí),通常要耗費(fèi)大量的時(shí)間去排查bug產(chǎn)生的原因,如何快速的定位bug,在很大程度上決定了你的開發(fā)效率。下面是...
    RossRoma閱讀 4,601評(píng)論 0 0
  • 關(guān)好店門,已經(jīng)是凌晨三點(diǎn)半。長(zhǎng)長(zhǎng)的舒了一口氣,將厚重的羽絨服裹得更加的嚴(yán)實(shí),生怕冷空氣順著衣角的縫隙侵入體內(nèi),即使...
    李彧飛閱讀 649評(píng)論 0 3
  • 張紅云 平頂山 堅(jiān)持分享第225天( 原創(chuàng)總第393天 2018年1月2日 星期二) 新年伊始,焦點(diǎn)團(tuán)隊(duì)的老...
    紅云_楊柳清風(fēng)閱讀 508評(píng)論 0 0

友情鏈接更多精彩內(nèi)容