Swift 可变参数& Objective-C 可变参数

Objective-C中可变参数的API很多,如:

void NSLog(NSString *format, ...)
+ (instancetype)stringWithFormat:(NSString *)format, ...
- (instancetype)initWithTitle:(nullable NSString *)title message:(nullable NSString *)message delegate:(nullable id /*<UIAlertViewDelegate>*/)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitle otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 

像以上方法中的最后一个参数, ...如何实现实现呢?如下:

- (NSString *)appendString:(NSString *)string otherSting:(NSString *)aString, ... {
    //重点在以下,这里我们定义一个数组来承载可变参数,最后做拼装
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    //定义一个指向个数可变的参数列表指针
    va_list params;
    id argument;
    
    if (aString) {
        [arr addObject:aString];
        va_start(params, aString);
        //返回参数列表中指针所指的参数,第二个参数为返回类型,并使指针指向参数列表中下一个参数
        while ((argument = va_arg(params, id))) {
            [arr addObject:argument];
        }
        //释放列表指针
        va_end(params);
    }
    
    return [NSString stringWithFormat:@"%@ %@", string, [arr componentsJoinedByString:@" "]];
}

调用时注意参数最后一个需要传nil,如下:

[xxx appendString:@"hello" otherSting:@"I", @"am", @"a", @"good", @"man", nil]

打印结果为: hello I am a good man

Swift的可变参数如下:

    func appendString(string: String, otherString: String, _ moreStrings: String...) -> String {
        
        var resurltString = string + " " + otherString
        
        resurltString += moreStrings.reduce("", { (x, y) -> String in
            x + " " + y
        });
        
        return resurltString
    }

调用:

xxx.appendString(string: "Hello", otherString: "I", "am", "a", "good", "man")

打印结果和上面一致。Nice!!!

    原文作者:WonderChang
    原文地址: https://www.jianshu.com/p/6333dbc612e1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞