Est-il un Swift alternative pour NSLog(@“%s”, __JOLI_FONCTION__)
En Objective-C, vous pouvez vous connecter à la méthode qui est appelée à l'aide de:
NSLog(@"%s", __PRETTY_FUNCTION__)
Ceci est généralement utilisé à partir d'un enregistrement de la macro.
Bien que Swift ne prend pas en charge les macros (je pense) j'aimerais utiliser un générique du journal de déclaration qui comprend le nom de la fonction a été appelée. Est-ce possible dans Swift?
Mise à jour:
Je vais maintenant utiliser cette fonction globale pour l'enregistrement qui peut être trouvé ici:
https://github.com/evermeer/Stuff#print
Et que vous pouvez installer à l'aide de:
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)
Qui aura pour résultat:
✳️ .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
- J'utilise
NSLog("Running %@ : %@",NSStringFromClass(self.dynamicType),__FUNCTION__)
- J'utilise github.com/goktugyil/QorumLogs
- Je pense que votre enregistrement de style devrait être la définition de "pretty fonction". Merci pour le partage.
Vous devez vous connecter pour publier un commentaire.
Swift a
#file
,#function
,#line
et#column
. De Langage De Programmation Swift:#file
- String - nom du fichier dans lequel elle apparaît.#line
- Int - le numéro de La ligne sur laquelle il apparaît.#column
- Int - le numéro de La colonne dans laquelle il commence.#function
- String - nom de la déclaration dans laquelle il apparaît.__PRETTY_FUNCTION__
, ce qui n'est pas facilement créés à partir de ces options. (Est-il un__CLASS__
? Si oui, je veux aider.)À partir de Swift 2.2, nous devrions l'utiliser:
De Le Langage De Programmation Swift Swift 3.1) à la page 894.
Swift 4
Voici ma démarche:
En faire une fonction globale et il suffit d'appeler
Bonus: Vous pourrez voir le thread est exécuté sur, [T] pour un thread d'arrière-plan et [M] pour le thread Principal.
De 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 déformés, maintenant. Heureusement, ils vont trouver une meilleure solution. Il pourrait être utile d'utiliser un #define jusqu'à ce que nous sommes hors de bêta.Ce code:
donne des résultats comme ceci:
EDIT: C'est plus de code, mais de me rapprocher de ce dont j'avais besoin, je pense que c'est ce que tu voulais.
Il donne de sortie comme ceci:
Je préfère définir une fonction log:
[Swift 3.1]
[Swift 3.0]
[Swift 2.0]
la sortie est quelque chose comme:
object
paramètre peut être déclaré commeAny
au lieu deT
.Ici est une mise à jour de Swift 2 réponses.
Exemple d'utilisation:
__FUNCTION__ becomes #function, __FILE__ becomes #file, and __LINE__ becomes #line.
Ou légère de la fonction de modification avec:
}
/* va produire une trace d'exécution comme:
AppDelegate:application(_:didFinishLaunchingWithOptions:):18
Produit:init(type:nom:année:prix:):34
FirstViewController:viewDidLoad():15
AppDelegate:applicationDidBecomeActive:62
*/
Que j'utilise, c'est tout ce qui est nécessaire dans une swift de fichier, tous les autres fichiers ramasser (comme une fonction globale).
Lorsque vous souhaitez publier l'application simplement en commentaire la ligne.
Swift 3.0
Swift 3.x+
Si vous ne voulez pas le ensemble nom de fichier puis ici, c'est une solution rapide pour que.
Une autre manière d'enregistrer appel de la fonction: