2014-06-30 12 views
15

Sto provando a stampare il nome della classe corrente in Swift. Più specificamente, mi piacerebbe ottenere il seguente risultato:Nome classe di stampa del file corrente in Swift

myFunction() in ClassContainingTheFunction 

Ho il nome della funzione che stampa bene. Questo è il più vicino che ho venuto alla stampa il nome della classe con il nome della funzione:

println("\(__FUNCTION__) in \(__FILE__)") 

stampe

myFunction() in path/to/TheFile.swift 

e

println("\(__FUNCTION__) in \(object_getClassName(self))") 

stampe

myFunction() in [mangled class name here] 

Entrambi sono vicini a ciò che io voglio, ma il percorso è lungo, e il nome della classe straziata può essere molto illeggibile rispetto al nome che vedo nel codice.

+0

possibile duplicato di [Come individuare il tipo di oggetto (in Swift)?] (Http://stackoverflow.com/questions/24101450/how-do-you-find-out-the-type- of-an-object-in-swift) –

+0

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

+2

@LouFranco Per il primo link: non sto cercando di scoprire il tipo. Sto cercando di stampare il nome della classe in cui è presente la chiamata 'println(). Per il secondo link: Quella domanda ha una risposta accettata e non è quello che sto cercando. Non sono nemmeno preoccupato di trovare la classe di qualsiasi oggetto, voglio sapere il nome della classe corrente. –

risposta

26

Quindi il problema è solo il percorso lungo per la stringa mostrata. La mia migliore idea sarebbe quella di accorciare la stringa solo al nome del file.

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 

Dal object_getClassNAme(...) utilizzerà la vera classe utilizzata e non il nome utilizzato come il cluster classe, è il modo sbagliato per voi. L'apprendimento dei nomi concreti di implementazione della classe renderebbe più semplice la creazione di.


Invece di prova si utilizza il modo di ottenere il nome del file, come __FILE__. Il seguente codice produce l'uscita che si sta cercando:

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

Swift 2.2

In Swift 2.2 quei vecchi identificatori sono obsolete e sostituite con #file, #line, #column e #function. esempio

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

uscita:

file81.swift 
+0

Questo non risponde alla domanda che sta cercando una descrizione [[self class]] equivalente. – kubbing

+0

@kubbing Dovresti averti risposto in agosto quando hai commentato, mi dispiace. Per essere chiari, questo in realtà risponde a ciò che volevo. Quello che hai proposto avrebbe stampato il nome dell'oggetto, volevo il nome del file in cui è chiamato il func. Non necessariamente la stessa cosa. –

+3

In Swift 2.2, utilizzare #function e #file invece di \ _ \ _ FUNCTION \ _ \ _ e \ _ \ _ FILE \ _ \ _. – user2067021

0

Penso che la segue è ciò che si vuole (a Swift 2.1 e superiori):

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

Ciao Mark. Non è esattamente la stessa cosa. Questo è il nome dell'oggetto. Volevo il nome del file in cui è stata chiamata la funzione. La risposta accettata, come è, ha ancora bisogno di un aggiornamento perché devi trasmettere a NSString ora e println è stampato, ma è ancora corretto. Grazie per l'input. –

2

La mia risposta è,

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

Volevo una soluzione che disconnettesse una bella stringa ordinata come quella s (Swift 3.0) - Nome classe - Nome funzione.ad esempio:

OnboardingGetStartedController - viewDidLoad()

così ho finito con una breve funzione che Ive ha messo nella mia classe utils, in questo modo:

class func logCurrentFunc(fileStr: String, funcStr: String) { 

    var fileName = fileStr.components(separatedBy: "/").last ?? "" 
    fileName = fileName.components(separatedBy:".").first ?? "" 
    let printFunc = "\(fileName) - \(funcStr)" 
    print(printFunc) 
} 

e chiamo questo da qualsiasi app , come questo:

Utils.logCurrentFunc(#file, funcStr: #function) 

È un po 'più ordinata rispetto ad altri suggerimenti.

1

a Swift 3 che è ora #file e #function

Speranza che aiuta.

+0

Più risposte già menzionano questo –

Problemi correlati