print("param1","param2")
它输出:
param1 param2
但是,使用我的LogUtil进行记录,
LogUtil.d("tag","param1","param2"),
它输出:
D - /LogUtil.swift(44): [["tag","param2"]]
我想输出原始的’打印’样式:
D -/LogUtil.swift(44): tag param1 param2
如何解决这个问题?谢谢!
class func p(level: LogLevel,items: Any...) { //todo eric thread id //todo eric fileName is too long //todo eric loglevel control //todo eric outputs to file let filePath = __FILE__ let lineNo = __LINE__ print("\(getLogLevelDesc(level)) - \(filePath)(\(lineNo)):",items) } class func d(items: Any...) { return p(LogLevel.DEBUG,items: items) } class func i(items: Any...) { return p(LogLevel.INFO,items: items) } class func w(items: Any...) { return p(LogLevel.WARN,items: items) } class func e(items: Any...) { return p(LogLevel.ERROR,items: items) } class func fatal(items: Any...) { return p(LogLevel.FATAL,items: items) }
解决方法
然后d调用p,将自己的项作为p的items参数的第一个参数传递.由于p的items参数也是可变参数,因此d可以为p的项传递更多参数.也就是说,d可以调用p(LogLevel.DEBUG,items:items,“more”,“words”).它没有,但它可以.
由于p的items参数是variadic Any …,p中的局部变量项也是[Any]类型,其值是[[“tag”,“param2”]].它是一个元素数组中的三个元素的数组.
你需要做的是make p或一些新函数,取一个非变量项参数,并从d和所有其他可变函数中调用它.
此外,不推荐使用__FILE__和__LINE___.如果您已升级到Xcode 7.3,则应使用新的#file和#line特殊表单.
但是你仍然有一个问题:#file和#line将返回在函数p中使用它们的文件和行.这可能不是你想要的.您可能想要程序调用d或i或其他任何内容的文件和行.
为此,您将文件和行参数传递给d(和其他函数),默认值为#file和#line.默认值将在呼叫站点展开,因此您将获得对d或i或其他任何呼叫的文件和行号.
所以最终你想要一个知道如何获取[Any](只有一层数组包装)并将其转换为空格分隔的字符串的函数.这是你如何做到这一点:
struct LogUtil { enum LogLevel: String { case Debug case Info case Warning case Error case Fatal } // The low-level function that all the others call. private static func log(level level: LogLevel,file: String,line: Int,items: [Any]) { let itemString = items.map { String($0) }.joinWithSeparator(" ") print("\(level) - \(file)(\(line)): \(itemString)") }
请注意,log(level:file:line:items :)不是variadic,因此它不会在其项目周围添加另一个数组包装器.
static func p(level: LogLevel,items: Any...,file: String = #file,line: Int = #line) { log(level: level,file: file,line: line,items: items) } static func d(items: Any...,line: Int = #line) { log(level: .Debug,items: items) } static func i(items: Any...,line: Int = #line) { log(level: .Info,items: items) } // other level-specific functions here... }
当您调用LogUtil.d(“tag”,“foo”,“bar”)时,输出看起来像您想要的:
Debug - /var/folders/kn/<snip>/playground282.swift(33): tag foo bar
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。