2014-06-30 41 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

多個答案已經提到這一點 –