我有以下代码:
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,函数名称和行。
答案 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")