Любой способ переопределить встроенную функцию печати, включая постоянные переменные? (#line, #function и т. д.) - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу иметь возможность переопределить стандартную функцию печати стандартной библиотеки 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 голосов
/ 24 апреля 2019

Так что, похоже, в моем случае изменение подписи решает проблему. Если конкретно указать тип, передаваемый аргументу 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, которые мне нужны, передают Strings. Реализация по умолчанию называется иначе:

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!
...