解決errorCode/errorcode和errorText/errortext問題參考技術(shù)方案

問題:在系統(tǒng)中的網(wǎng)絡(luò)請求的block處理中,有2種errorCode和errorcode 格式,errortext和errorText同理,為了避免寫錯(cuò),現(xiàn)在提出以下技術(shù)方案。

1.如果以前的代碼保證正確,則可以給NSDictionary增加category 方法,以后獲取errorcode,errortext統(tǒng)一使用errorCodeForKey,errorTextForKey方法。
缺點(diǎn):系統(tǒng)中會出現(xiàn)2中方式的的取值
優(yōu)點(diǎn):安全,效率高。

import <Foundation/Foundation.h>

@interface NSDictionary (ErrorCodeAndErrorText)

  • (NSString*)errorCodeForKey:(id)key;
  • (NSString*)errorTextForKey:(id)key;

@end

import "NSDictionary+ErrorCodeAndErrorText.h"

import <objc/message.h>

@implementation NSDictionary (ErrorCodeAndErrorText)

  • (NSString*)errorCodeForKey:(id)key{
    id value = [self objectForKey:key];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    value = [self objectForKey:@"errorcode"];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    value = [self objectForKey:@"errorCode"];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    return nil;
    }
  • (NSString*)errorTextForKey:(id)key{
    id value = [self objectForKey:key];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    value = [self objectForKey:@"errortext"];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    value = [self objectForKey:@"errorText"];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    return nil;
    }
    @end

2.在+(id)changeType:(id)myObj方法中針對errorText errorCode的處理方法。
缺點(diǎn):這個(gè)字典稍顯混亂,遍歷字典效率稍微低。
優(yōu)點(diǎn):對老代碼兼容。

+(NSDictionary *)errorKeyDic:(NSDictionary *)myDic

{

NSArray *keyArr = [myDic allKeys];
NSMutableDictionary *resDic = [NSMutableDictionary dictionaryWithDictionary:myDic];

if([keyArr containsObject:@"errorcode"]){
     [resDic setObject:[myDic objectForKey:@"errorcode"] forKey:@"errorCode"];
}else  if([keyArr containsObject:@"errorCode"]){
    [resDic setObject:[myDic objectForKey:@"errorCode"] forKey:@"errorcode"];
}

if([keyArr containsObject:@"errortext"]){
    [resDic setObject:[myDic objectForKey:@"errortext"] forKey:@"errorText"];
}else  if([keyArr containsObject:@"errorText"]){
    [resDic setObject:[myDic objectForKey:@"errorText"] forKey:@"errortext"];
}
 return resDic;

}

3.利用runtime,在攔截NSDictionary的objectForKey:方法;
缺點(diǎn):會修改全局,慎用?。?!
優(yōu)點(diǎn):不需要改動其他地方。

import <Foundation/Foundation.h>

@interface NSDictionary (ErrorCodeAndErrorText)

@end

import "NSDictionary+ErrorCodeAndErrorText.h"

import <objc/runtime.h>

@implementation NSDictionary (ErrorCodeAndErrorText)

  • (void)load
    {
    //NSDictnary的真實(shí)類型__NSDictionaryI
    Class class = objc_getClass("__NSDictionaryI");

    SEL originalSelector = @selector(objectForKey:);
    SEL swizzledSelector = @selector(dw_objectForKey:);

    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

    BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
    if (success) {
    class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
    } else {
    method_exchangeImplementations(originalMethod, swizzledMethod);
    }

}

  • (id)errorCodeForKey:(id)key{
    id value = [self dw_objectForKey:key];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    value = [self dw_objectForKey:@"errorcode"];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    value = [self dw_objectForKey:@"errorCode"];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    return nil;
    }
  • (id)errorTextForKey:(id)key{
    id value = [self dw_objectForKey:key];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    value = [self dw_objectForKey:@"errortext"];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    value = [self dw_objectForKey:@"errorText"];
    if (value != nil && value != [NSNull null])
    {
    return value;
    }
    return nil;
    }
  • (nullable id)dw_objectForKey:(id)key
    {
    if([key isEqualToString:@"errorCode"] || [key isEqualToString:@"errorcode"]){
    return [self errorCodeForKey:@"errorcode"];
    }else if([key isEqualToString:@"errorText"] || [key isEqualToString:@"errorText"]){
    return [self errorTextForKey:@"errorText"];
    }
    return [self dw_objectForKey:key];
    }

@end

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

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

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