I'm trying to print the name of the current class in Swift. More specifically, I'd like achieve the following output:
myFunction() in ClassContainingTheFunction
I have the function name printing fine. This is the closest I've came to printing the class name along with the function name:
println("\(__FUNCTION__) in \(__FILE__)")
prints
myFunction() in path/to/TheFile.swift
and
println("\(__FUNCTION__) in \(object_getClassName(self))")
prints
myFunction() in [mangled class name here]
Both of these are close to what I want, but the path is long, and the mangled class name can be very unreadable compared to the name I see in code.
So your problem is only the long path for the shown String. My best idea would be to shorten the String to the filename only.
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
Since object_getClassNAme(...)
will use the real used class and not the name you used like the the class cluster, it is the wrong way for you. Learning the concrete class implementation names would make it easier though.
Instead of test you use your way of getting the filename, like __FILE__
. The following code produces the output you are looking for:
println("\(__FUNCTION__) in \(__FILE__.lastPathComponent.stringByDeletingPathExtension)")
In Swift 2.2 those old identifiers are deprecated and replaced with #file
, #line
, #column
, and #function
.
print("\(#function) in \(#file.components(separatedBy: "/").last ?? "")")
Output example:
file81.swift
I wanted a solution that logged out a nice neat string like this (Swift 3.0) - Class Name - Function Name. eg :
OnboardingGetStartedController - viewDidLoad()
So I ended up with a short function that Ive put in my utils class, like this :
class func logCurrentFunc(fileStr: String, funcStr: String) {
var fileName = fileStr.components(separatedBy: "/").last ?? ""
fileName = fileName.components(separatedBy:".").first ?? ""
let printFunc = "\(fileName) - \(funcStr)"
print(printFunc)
}
And I call this from anywhere in the app, like this :
Utils.logCurrentFunc(#file, funcStr: #function)
Its just a bit neater looking than other suggestions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With