Dans Objective C, vous pouvez enregistrer la méthode appelée en utilisant:
NSLog(@"%s", __PRETTY_FUNCTION__)
Cela est généralement utilisé à partir d'une macro de journalisation.
Bien que Swift ne prenne pas en charge les macros (je pense), j'aimerais toujours utiliser une instruction de journal générique qui inclut le nom de la fonction qui a été appelée. Est-ce possible dans Swift?
Mise à jour: J'utilise maintenant cette fonction globale pour la journalisation qui peut être trouvée ici: https://github.com/evermeer/Stuff#print Et que vous pouvez installer en utilisant:
pod 'Stuff/Print'
Voici le code:
public class Stuff {
public enum logLevel: Int {
case info = 1
case debug = 2
case warn = 3
case error = 4
case fatal = 5
case none = 6
public func description() -> String {
switch self {
case .info:
return "❓"
case .debug:
return "✳️"
case .warn:
return "⚠️"
case .error:
return "🚫"
case .fatal:
return "🆘"
case .none:
return ""
}
}
}
public static var minimumLogLevel: logLevel = .info
public static func print<T>(_ object: T, _ level: logLevel = .debug, filename: String = #file, line: Int = #line, funcname: String = #function) {
if level.rawValue >= Stuff.minimumLogLevel.rawValue {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm:ss:SSS"
let process = ProcessInfo.processInfo
let threadId = "?"
let file = URL(string: filename)?.lastPathComponent ?? ""
Swift.print("\n\(level.description()) .\(level) ⏱ \(dateFormatter.string(from: Foundation.Date())) 📱 \(process.processName) [\(process.processIdentifier):\(threadId)] 📂 \(file)(\(line)) ⚙️ \(funcname) ➡️\r\t\(object)")
}
}
}
Que vous pouvez utiliser comme ceci:
Stuff.print("Just as the standard print but now with detailed information")
Stuff.print("Now it's a warning", .warn)
Stuff.print("Or even an error", .error)
Stuff.minimumLogLevel = .error
Stuff.print("Now you won't see normal log output")
Stuff.print("Only errors are shown", .error)
Stuff.minimumLogLevel = .none
Stuff.print("Or if it's disabled you won't see any log", .error)
Ce qui se traduira par:
✳️ .debug ⏱ 02/13/2017 09:52:51:852 📱 xctest [18960:?] 📂 PrintStuffTests.swift(15) ⚙️ testExample() ➡️
Just as the standard print but now with detailed information
⚠️ .warn ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(16) ⚙️ testExample() ➡️
Now it's a warning
🚫 .error ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(17) ⚙️ testExample() ➡️
Or even an error
🚫 .error ⏱ 02/13/2017 09:52:51:855 📱 xctest [18960:?] 📂 PrintStuffTests.swift(21) ⚙️ testExample() ➡️
Only errors are shown
NSLog("Running %@ : %@",NSStringFromClass(self.dynamicType),__FUNCTION__)
Réponses:
Swift a
#file
,#function
,#line
et#column
. À partir du langage de programmation Swift :#file
- Chaîne - Le nom du fichier dans lequel il apparaît.#line
- Int - Le numéro de ligne sur lequel il apparaît.#column
- Int - Le numéro de colonne dans lequel il commence.#function
- String - Le nom de la déclaration dans laquelle elle apparaît.la source
__PRETTY_FUNCTION__
, qui n'est pas facilement créée à partir des options données. (Y a-t-il un__CLASS__
? Si oui, cela aiderait.)À partir de Swift 2.2, nous devrions utiliser:
À partir du langage de programmation Swift (Swift 3.1) à la page 894.
la source
Swift 4
Voici mon approche:
Faites-en une fonction globale et appelez simplement
Bonus: Vous verrez que le thread est exécuté sur, [T] pour un thread d'arrière-plan et [M] pour le thread principal.
la source
Depuis XCode beta 6, vous pouvez utiliser
reflect(self).summary
pour obtenir le nom de la classe et__FUNCTION__
pour obtenir le nom de la fonction, mais les choses sont un peu mutilées, pour le moment. J'espère qu'ils trouveront une meilleure solution. Cela peut valoir la peine d'utiliser une #define jusqu'à ce que nous soyons hors de la version bêta.Ce code:
donne des résultats comme celui-ci:
EDIT: C'est plus de code, mais m'a rapproché de ce dont j'avais besoin, ce que je pense que c'est ce que vous vouliez.
Il donne une sortie comme celle-ci:
la source
Je préfère définir une fonction de journalisation globale:
[Swift 3.1]
[Swift 3.0]
[Swift 2.0]
la sortie est quelque chose comme:
la source
object
paramètre peut être déclaré commeAny
au lieu deT
.Voici une réponse Swift 2 mise à jour.
Exemple d'utilisation:
la source
__FUNCTION__ becomes #function, __FILE__ becomes #file, and __LINE__ becomes #line.
Ou légère modification de fonction avec:
}
/ * produira une trace d'exécution comme: AppDelegate: application (_: didFinishLaunchingWithOptions :): 18 Product: init (type: name: year: price :): 34 FirstViewController: viewDidLoad (): 15 AppDelegate: applicationDidBecomeActive: 62 * /
la source
J'utilise, c'est tout ce qui est nécessaire dans un fichier swift, tous les autres fichiers le récupéreront (en tant que fonction globale). Lorsque vous souhaitez libérer l'application, commentez simplement la ligne.
la source
Swift 3.0
la source
Swift 3.x +
Si vous ne voulez pas le nom complet du fichier, voici une solution rapide pour cela.
la source
Une autre façon de consigner l'appel de fonction:
la source