OC 简化项目中拼接字符串的方法

本文介绍了在Objective-C项目中如何简化字符串拼接的过程,通过利用`va_list`、`NS_REQUIRES_NIL_TERMINATION`和`__VA_ARGS__`等特性,实现更便捷的动态字符串拼接。并提供了相关代码示例和参考资料。

在做项目中,经常会有拼接字符串的需求.

比如:


如何拼接字符串能,一般我们会经过这么一个过程:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //显示: 申请秒豆: ??
    
    NSString *numStr = @"20";
    NSString *tips;
    
    //初级做法. 直接使用系统API
    tips = [NSString stringWithFormat:@"剩余天数: %@",numStr];
        //或
    tips = [@"剩余天数: " stringByAppendingString:numStr];
    
    //中级做法. 使用宏来简化
#define AddStr(str1,str2)           [str1 stringByAppendingString:str2]
    
    tips = AddStr(@"剩余天数: ", numStr);
    
    /*
     但是遇到拼接两个以上字符串时,又变得麻烦了.
     也许可以再定义一个宏,处理三个字符串的情况.
     也可以像这样使用:
    */
    tips = AddStr(@"活动", AddStr(@"剩余天数: ", numStr));
    
}


  怎么样能够使拼接字符串变得更简单些呢?

 下面直接上代码(我的Github):


最终结果:

    tips = YCIJoinStrings(@"活动",@"剩余天数: ",numStr);

方案:

#import <Foundation/Foundation.h>

#define YCIJoinStrings(firstStr,...) [NSString JoinedWithSubStrings:firstStr,__VA_ARGS__,nil]

@interface NSString (YCI)

+ (NSString *)JoinedWithSubStrings:(NSString *)firstStr,...NS_REQUIRES_NIL_TERMINATION;

@end

#import "NSString+YCI.h"

@implementation NSString (YCI)

+ (NSString *)JoinedWithSubStrings:(NSString *)firstStr,...NS_REQUIRES_NIL_TERMINATION{
    
    NSMutableArray *array = [NSMutableArray new];
    
    va_list args;
    
    if(firstStr){
        
        [array addObject:firstStr];
        
        va_start(args, firstStr);
        
        id obj;
        
        while ((obj = va_arg(args, NSString* ))) {
            [array addObject:obj];
        }
        
        va_end(args);
    }
    
    
    return [array componentsJoinedByString:@""];
    
}

@end

注解:

考虑到要拼接的字符串个数不固定的因素,必须要使用va_list相关的方法

va_list

是在C语言中解决变参问题的一组宏.(具体参看:百度百科)


NS_REQUIRES_NIL_TERMINATION

因为使用va_list需要提前知道有多少个参数.这就增添了很大的不便.NS_REQUIRES_NIL_TERMINATION就是用于声明需要一个nil做结尾.就像我们使用NSArray的方法:

[NSArray arrayWithObjects:@"obj", nil];
通过在va_list的结尾插入一个nil,我们就可以用nil来做结尾的判断了.避免需要提前知道参数个数的麻烦.

可参考(曾迦的简书)


__VA_ARGS__

C99 引入了对参数个数可变的函数式宏的正式支持。在宏 ``原型" 的末尾加上符号 ... (就像在参数可变的函数定义中), 宏定义中的伪宏 __VA_ARGS__ 就会在调用是 替换成可变参数。

有了__VA_ARGS__支持,我们可以进一步简化调用.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值