有什么方法可以覆盖包括常量在内的内置打印功能的迅捷功能吗? (#line,#function等)

时间:2019-04-24 17:55:21

标签: swift logging

我希望能够覆盖默认的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传递为其默认值。

这会导致“函数的歧义使用”错误,并且更改签名也无济于事,因为默认实现是优先于我的函数调用的。

我查看了扩展程序,甚至出现了混乱,但是在这种情况下,这些扩展程序似乎都没有成果。

1 个答案:

答案 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!