Home > 语言编程, 零敲碎打 > [iOS] 实现IIF功能和DECODE函数功能

[iOS] 实现IIF功能和DECODE函数功能

iOS开发过程中需要处理大量分支判断代码,需要大量使用if、switch等进行分支处理。代码编写和查看都可能出现潜在问题,使用Objective-c语言的自身特点,可以通过以下转换,优化分支判断处理的代码写法。关键是可以一行代码搞定各种分支判断。实现代码简化。

使用宏定义将三目运算改为IIF函数运算,类似于EXCEL的IF公式

1
2
3
4
#if !defined(IIF)
#define IIF_IMPL(condition,true_,false_) (condition)?true_:false_
#define IIF(condition,true_,false_) IIF_IMPL(condition,true_,false_)
#endif

使用Category拓展NSString,支持DECODE计算,类似于ORACLE等数据库系统中SQL的DECODE()函数。这里使用了可变参数列表方式可以实现无限制使用参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-(NSString *)decode:(NSString *)firstKey, ... NS_REQUIRES_NIL_TERMINATION
{
    va_list params; //定义一个指向个数可变的参数列表指针;
    id next;
    if (firstKey) {
        va_start(params,firstKey);//va_start  得到第一个可变参数地址,
        id key = firstKey;
        //va_arg 指向下一个参数地址
        while(key && (next = va_arg(params,id)))
        {
            if (next && key){
                if ([self isEqualToString:key]) {
                    return next;
                }
            }
            key = va_arg(params,id);
        }
        return key;
        //置空
        va_end(params);
    }else{
        return firstKey;
    }
}

使用IIF和DECODE的方法如下

1
2
3
4
5
6
7
8
9
10
11
12
    //IIF使用DEMO
    int a = 1;
    //单次
    NSString *result1 = IIF(a==1, @"a = 1", @"a <> 1");
    //级连
    NSString *result2 = IIF(a==1, IIF(a==2, @"a = 2", @"a <> 2"), @"a <> 1");
    //DECODE使用DEMO
    NSString *str2Decode = @"abc";
    //支持使用Default
    NSString *decodeResult1 = [str2Decode decode:@"key1",@"1",@"abc",@"2",@"efg",@"3",@"with default",nil];
    //不使用Default
    NSString *decodeResult2 = [str2Decode decode:@"key1",@"1",@"abc",@"2",@"efg",@"3",nil];
  1. No comments yet.
  1. No trackbacks yet.