2014-06-30 39 views
15

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

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

+0

可能的重复[你如何找出对象的类型(在Swift中)?](http://stackoverflow.com/questions/24101450/how-do-you-find-out-the-type-对象在迅速) –

+0

或此:http://stackoverflow.com/questions/24006165/how-do-i-print-the-type-or-class-of-a-variable-in- swift –

+2

@LouFranco对于第一个链接:我没有试图找出类型。我试图打印println()调用所在的类的名称。对于第二个链接:该问题有一个可接受的答案,而这不是我正在寻找的。我也不担心找到任何对象的类,我想知道当前类的名称。 –

回答

26

所以你的问题只是显示的字符串的长路径。 我最好的想法是只将字符串缩短为文件名。

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__。下面的代码生成您正在寻找的输出:那些老标识已被弃用,并与#file#line#column#function更换

println("\(__FUNCTION__) in \(__FILE__.lastPathComponent.stringByDeletingPathExtension)") 

雨燕2.2

雨燕2.2

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

输出例如:

file81.swift 
+0

这并不回答他正在寻找[[self class] description]等价的问题。 – kubbing

+0

@kubbing当你评论时,应该在八月回答你,对不起。要清楚的是,这实际上回答了我想要的。你提出的建议是打印对象的名称,我希望调用func的文件的名称不一定是相同的。 –

+3

在Swift 2.2中,使用#function和#file而不是\ _ \ _ FUNCTION \ _ \ _和\ _ \ _ FILE \ _ \ _。 – user2067021

0

我认为下面是你想要的(在雨燕2.1及更高版本):

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

嗨马克。这不完全是一回事。这是对象的名称。我希望func被调用的文件的名称。被接受的答案仍然需要一些更新,因为现在必须转换为NSString并且println是打印的,但它仍然是正确的。感谢您的意见。 –

2

我的答案很简单,

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

我想要一个解决方案,注销一个漂亮整洁的字符串,如thi s(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) 

它只是比其他建议更整洁一些。

1

在SWIFT 3现在是#file#function

希望有所帮助。

+0

多个答案已经提到这一点 –