Доступ к «уровню» области видимости в Swift для более значимых строк отладки - PullRequest
0 голосов
/ 14 февраля 2019

Я ищу способ динамического определения «уровня» области видимости, на котором выполняется код.

Например, если класс z имеет функции x и y:

Если функция x вызывается классом z, операторы print будут выглядеть так же, как если бы ее вызывали из функции y или из функции внутри функции y.

Я хочу включить дополнительные пробелы на «уровень» области видимости, чтобы при печати для обозначения вызываемой функции она печатала с отступом, который на одну вкладку больше, чем код, вызвавший ее.Для этого мне нужно как-то определить «уровень» охвата.Я мог бы сделать это вручную, но это было бы более болезненно, чем, вероятно, стоило бы.

Делает ли Swift это автоматически в любом месте, к которому я могу получить доступ?

edit Iтолько что понял, что то, что я ищу, технически не может быть "уровнем" области видимости, а скорее "уровнем" "вызываемых функций".Например, я хочу получить значение, которое будет + = 1 для каждого "{", начинающего функцию, и - = 1 для каждого "}", заканчивающего функцию, если это имеет смысл, поэтому я могу умножить "\ t" на этозначение и поместите результат в начало всех операторов печати в этом функциональном блоке.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Для тех, кто ищет готовое решение, вот что я сделал в точности:

С самого начала у меня была первая строка каждой функции:

print("\t\(#function)  \(self.classForCoder)  \(#file.getLastPath())  \(Thread.current)")

Этодал мне полезную информацию отладки, которая была отступа от более специфических отладочных операторов печати.Его также не нужно настраивать для каждой функции, я мог просто скопировать / вставить.Основываясь на введенном выше принятом ответе для отслеживания области видимости, я создал структуру быстрого стека только для отслеживания имен функций и печати их с учетом контекста: https://gist.github.com/austenstrine/38f27e32dc1248d16d44f1eac1af67d5

Я использовал эту структуру длястатическая переменная:

class AppData //in a separate file
{
    static var funcStack = ScopedPrintableStack()
}

Я использовал размер стека, чтобы определить область действия в операторе печати.Теперь у меня есть это в верхней части каждой функции:

AppData.funcStack.push(#function)
print(String(repeating: "\t", count: AppData.funcStack.count)+"\(#function)  \(self.classForCoder)  \(#file.getLastPath())  \(Thread.current)")
defer {AppData.funcStack.popToss()}

Поиск и замена на уровне проекта облегчает обслуживание, пока я не касаюсь одной, не касаясь их всех.Если позже я закомментирую оператор print для всего проекта, чтобы обезжелезить консоль, я все равно смогу получить доступ к иерархии «области действия функции», напечатав AppData.funcStack.

Также обратите внимание, что функция .getLastPath() является пользовательскойрасширение класса String, поэтому мне не нужно писать String("foo/bar/some/Path.swift".split(separator: "/").last!), чтобы получить "Path.swift".

0 голосов
/ 14 февраля 2019

Я не думаю, что есть какой-то встроенный механизм для того, что вы хотите.Вы можете загрузить трассировку стека и построить из этого то, что вы хотите, но это будет изрядная работа.

В качестве альтернативы, вы можете создать статическую переменную callDepth, увеличивая ее при входе в каждую функцию,и уменьшать его в конце каждой функции (или в блоке отсрочки, определенном в начале каждой функции, чтобы он работал, даже если у вас есть операторы return в разных местах ваших функций.)

Затем вы можете использоватьcallDepth переменная для определения количества вкладок, используемых при регистрации данных вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...