gpt4 book ai didi

swift - 将可变参数传递给 'print' 不会产生所需的输出

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:46 25 4
gpt4 key购买 nike

我正在编写一个 LogUtil 类,它只是将参数传递给带有额外信息(例如“文件名、行号”等)的“打印”函数。请参见下面的代码。

但是,通常我们使用'print'函数输出时是这样的:

  print("param1", "param2")

它输出:

  param1 param2

但是,使用我的LogUtil 来记录,

 LogUtil.d("tag", "param1", "param2"), 

它输出:

D - /LogUtil.swift(44): [["tag", "param1", "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)
}

最佳答案

首先你调用LogUtil.d("tag", "param1", "param2") .自 items参数声明为可变参数 Any... , 局部变量 items里面d类型为 [Any] , 并且具有值 ["tag", "param1", "param2"] .

然后d电话 p , 通过它自己的 items作为 p第一个 参数的 items范围。自 pitems参数也是可变的,d 可以p 传递更多参数的 items .即 d 可以调用p(LogLevel.DEBUG, items: items, "more", "words") .它不会,但它可以。

pitems参数是可变的 Any... , 局部变量 items里面p也是类型 [Any] , 其值为 [["tag", "param1", "param2"]] .它是一个包含一个元素的数组中的三个元素的数组。

你需要做的是制作p ,或一些新功能,采用-variadic items参数,并从 d 调用它以及所有其他可变函数。

此外,__FILE____LINE___已弃用。如果你已经升级到 Xcode 7.3,你应该使用新的 #file#line而是使用特殊形式。

但是你还有一个问题:#file#line将返回使用它们的文件和行 inside function 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:) 不是可变参数,因此它不会在其 items 周围添加另一个数组包装器.

然后定义所有用户可见的函数来调用 log功能:

    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..., file: String = #file, line: Int = #line) {
log(level: .Debug, file: file, line: line, items: items)
}

static func i(items: Any..., file: String = #file, line: Int = #line) {
log(level: .Info, file: file, line: line, items: items)
}

// other level-specific functions here...

}

当您调用 LogUtil.d("tag", "foo", "bar") 时,输出看起来像你想要的:

Debug - /var/folders/kn/<snip>/playground282.swift(33): tag foo bar

关于swift - 将可变参数传递给 'print' 不会产生所需的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com