Класс печати Имя текущего файла в 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)")