Print Class Name of Current File in 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.


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)") 

Swift 2.2

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

In swift 3 it is now #file and #function

Hope that helps.


My short answer is,

print(" Function name : \(#function), Class Name : \(self.dynamicType), File Path : \(#file)")

Tags:

Ios

Swift