【问题标题】:Print Class Name of Current File in Swift在 Swift 中打印当前文件的类名
【发布时间】:2014-08-21 02:45:07
【问题描述】:

我正在尝试在 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]

这两个都接近我想要的,但是路径很长,并且与我在代码中看到的名称相比,损坏的类名可能非常难以阅读。

【问题讨论】:

标签: ios swift


【解决方案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)") 

斯威夫特 2.2

Swift 2.2 中,这些旧标识符已被弃用,并替换为 #file#line#column#function

print("\(#function) in \(#file.components(separatedBy: "/").last ?? "")")

输出示例:

file81.swift

【讨论】:

  • 这并没有回答他正在寻找 [[self class] description] 等价物的问题。
  • @kubbing 应该在 8 月份回复您时回复您,抱歉。需要明确的是,这确实回答了我想要的。你提出的将打印对象的名称,我想要调用函数的文件的名称。不一定是同一件事。
  • 在 Swift 2.2 中,使用 #function 和 #file 而不是 __FUNCTION__ 和 __FILE__。
【解决方案2】:

我认为以下是您想要的(在 Swift 2.1 及更高版本中):

print("\(__FUNCTION__) in \(self.dynamicType)")

【讨论】:

  • 嗨,马克。那不完全一样。那是对象的名称。我想要调用函数的文件的名称。接受的答案仍然需要一些更新,因为您现在必须转换为 NSString 并且 println 是打印,但它仍然是正确的。感谢您的意见。
【解决方案3】:

我的简短回答是,

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

【讨论】:

    【解决方案4】:

    我想要一个解决方案,它可以像这样(Swift 3.0)-类名-函数名注销一个漂亮的字符串。例如:

    OnboardingGetStartedController - viewDidLoad()

    所以我最终在我的 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)
    

    它只是比其他建议看起来更整洁。

    【讨论】:

      【解决方案5】:

      在 swift 3 中现在是 #file#function

      希望对您有所帮助。

      【讨论】:

        【解决方案6】:
        print("=== \(type(of: self)).\(#function):\(#line) - message")
        

        结果

        === HomeScene.onAppear():189 - message
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-03
          相关资源
          最近更新 更多