Swift问题传递可变数量的参数

时间:2015-08-13 15:42:21

标签: swift arguments

我有以下代码:

public static func e(file: String = __FILE__,
    function: String = __FUNCTION__,
    line: Int = __LINE__,format: String, args: CVarArgType...)
{
    NSLog([%d]\t [%@] " + format,line,function, args); //<<< I have no idea how to pass the params here
}

我在NSLog上遇到无法像我一样调用的编译器错误。

我只需要使用单个NSLOG调用打印var args,函数名称和行。

1 个答案:

答案 0 :(得分:4)

Swift function with args... pass to another function with args类似, 你必须创建一个CVaListPointer(C中的Swift等价的va_list)并调用一个带CVaListPointer参数的函数, 在这种情况下NSLogv()

public class Logger {
    public static func e(
        format: String,
        file: String = __FILE__,
        function: String = __FUNCTION__,
        line: Int = __LINE__,
        args: CVarArgType...)
    {
        let extendedFormat = "[%d]\t [%@] " + format
        let extendedArgs : [CVarArgType] = [ line, function ] + args
        withVaList(extendedArgs) { NSLogv(extendedFormat, $0) }
    }
}

// Example usage:
Logger.e("x = %d, y = %f, z = %@", args: 13, 1.23, "foo")

我已将format作为第一个参数,因此没有外部参数 参数名称。变量参数列表必须是最后一个参数 在 Swift 1.2 中,此外部参数无法避免 与默认参数组合。

Swift 2 中,您可以避免使用外部参数名称 变量参数:

public class Logger {
    public static func e(
        format: String,
        _ args: CVarArgType...,
        file: String = __FILE__,
        function: String = __FUNCTION__,
        line: Int = __LINE__)
    {
        let extendedFormat = "[%d]\t [%@] " + format
        let extendedArgs : [CVarArgType] = [ line, function ] + args
        withVaList(extendedArgs) { NSLogv(extendedFormat, $0) }
    }
}

// Example usage:
Logger.e("x = %d, y = %f, z = %@", 13, 1.23, "foo")