Класс печати Имя текущего файла в Swift
Я пытаюсь напечатать имя текущего класса в Swift. В частности, мне бы хотелось получить следующий результат:
myFunction() in ClassContainingTheFunction
У меня есть печать имени функции. Это ближайший я пришел к печати имени класса вместе с именем функции:
println("\(__FUNCTION__) in \(__FILE__)")
печатает
myFunction() in path/to/TheFile.swift
и
println("\(__FUNCTION__) in \(object_getClassName(self))")
печатает
myFunction() in [mangled class name here]
Оба они близки к тому, что я хочу, но путь длинный, и искомое имя класса может быть очень нечитаемым по сравнению с именем, которое я вижу в коде.
Ответы
Ответ 1
Итак, ваша проблема - это только длинный путь для показанной строки.
Моя лучшая идея заключалась бы в том, чтобы сократить строку только до имени файла.
var test: String = "/Users/user/Project/classfile.m"
test = test.lastPathComponent // here it is only classfile.m
test = test.stringByDeletingPathExtension // here it is only classfile
Так как object_getClassNAme(...)
будет использовать реальный использованный класс, а не имя, которое вы использовали как кластер классов, это неправильный путь для вас. Изучение конкретных имен реализации класса облегчило бы это.
Вместо теста вы используете свой способ получения имени файла, например __FILE__
. Следующий код выводит результат, который вы ищете:
println("\(__FUNCTION__) in \(__FILE__.lastPathComponent.stringByDeletingPathExtension)")
Swift 2.2
В Swift 2.2 эти старые идентификаторы устарели и заменены на #file
, #line
, #column
и #function
.
print("\(#function) in \(#file.components(separatedBy: "/").last ?? "")")
Пример вывода:
file81.swift
Ответ 2
Мой короткий ответ:
print(" Function name : \(#function), Class Name : \(self.dynamicType), File Path : \(#file)")
Ответ 3
Мне нужно решение, которое вышло из этой чистой строки (Swift 3.0) - Class Name - Function Name. например:
OnboardingGetStartedController - viewDidLoad()
Итак, я закончил с короткой функцией, которую Ive поставил в моем классе utils, например:
class func logCurrentFunc(fileStr: String, funcStr: String) {
var fileName = fileStr.components(separatedBy: "/").last ?? ""
fileName = fileName.components(separatedBy:".").first ?? ""
let printFunc = "\(fileName) - \(funcStr)"
print(printFunc)
}
И я вызываю это из любого места в приложении, например:
Utils.logCurrentFunc(#file, funcStr: #function)
Его просто немного выглядят лучше, чем другие предложения.
Ответ 4
В swift 3 теперь #file
и #function
Надеюсь, что это поможет.
Ответ 5
Я думаю, что вы хотите (в Swift 2.1 и выше):
print("\(__FUNCTION__) in \(self.dynamicType)")