我希望能够覆盖默认的Swift标准库打印功能,并包括行号和函数名。我尝试了几种方法,例如
public func print(_ items: Any..., separator: String = \(#line), terminator: String = #function {
let output = items.map { "\(terminator) \(separator) -> \($0)" }.joined(separator: " ")
Swift.print(output, terminator: "\n")
}
这将正确打印出调用方法的函数名称,但是行号被设置为打印函数的行号。因此,我尝试将分隔符类型更改为Int
并将#line
传递为其默认值。
这会导致“函数的歧义使用”错误,并且更改签名也无济于事,因为默认实现是优先于我的函数调用的。
我查看了扩展程序,甚至出现了混乱,但是在这种情况下,这些扩展程序似乎都没有成果。
答案 0 :(得分:0)
在我看来,签名更改确实可以解决问题。通过具体说明传递给items
参数的类型,调用了我的自定义方法。
public func print(_ items: String..., filename: String = #file, function : String = #function, line: Int = #line, separator: String = " ", terminator: String = "\n") {
let pretty = "\(URL(fileURLWithPath: filename).lastPathComponent) [#\(line)] \(function)\n\t-> "
let output = items.map { "\($0)" }.joined(separator: separator)
Swift.print(pretty+output, terminator: terminator)
}
请注意,我关心的所有打印语句都将传递字符串。默认的实现称为否则:
print(1+1)
// 2
print("Hello, World!")
// ExampleVC.swift [#101] viewDidLoad()
// -> Hello, World!
print("Hello", "World", separator: ", ", terminator: "!\n")
// ExampleVC.swift [#101] viewDidLoad()
// -> Hello, World!