Print Class Name of Current File in Swift

前端 未结 6 1581
[愿得一人]
[愿得一人] 2020-12-30 03:36

I\'m trying to print the name of the current class in Swift. More specifically, I\'d like achieve the following output:

myFunction() in ClassContainingTheFun         


        
相关标签:
6条回答
  • 2020-12-30 03:59

    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.

    0 讨论(0)
  • 2020-12-30 04:00

    I think the following is what you want (in Swift 2.1 and up):

    print("\(__FUNCTION__) in \(self.dynamicType)")
    
    0 讨论(0)
  • 2020-12-30 04:00
    print("=== \(type(of: self)).\(#function):\(#line) - message")
    

    result

    === HomeScene.onAppear():189 - message
    
    0 讨论(0)
  • 2020-12-30 04:06

    My short answer is,

    print(" Function name : \(#function), Class Name : \(self.dynamicType), File Path : \(#file)")
    
    0 讨论(0)
  • 2020-12-30 04:22

    In swift 3 it is now #file and #function

    Hope that helps.

    0 讨论(0)
  • 2020-12-30 04:24

    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
    
    0 讨论(0)
提交回复
热议问题