1+ import Foundation
2+ import SwiftUI
3+
4+ enum LogCategory : String {
5+ case lifecycle = " 🔄 "
6+ case memory = " 💾 "
7+ case performance = " ⚡️ "
8+ case ui = " 🎨 "
9+ case network = " 🌐 "
10+ case error = " ❌ "
11+ case warning = " ⚠️ "
12+ case success = " ✅ "
13+ case debug = " 🔍 "
14+ }
15+
16+ struct Logger {
17+ static func log(
18+ _ message: String ,
19+ category: LogCategory ,
20+ file: String = #file,
21+ function: String = #function,
22+ line: Int = #line
23+ ) {
24+ let fileName = ( file as NSString ) . lastPathComponent
25+ let timestamp = ISO8601DateFormatter ( ) . string ( from: Date ( ) )
26+ print ( " \( category. rawValue) [ \( timestamp) ] [ \( fileName) : \( line) ] \( function) - \( message) " )
27+ }
28+
29+ static func trackMemory(
30+ file: String = #file,
31+ function: String = #function,
32+ line: Int = #line
33+ ) {
34+ var info = mach_task_basic_info ( )
35+ var count = mach_msg_type_number_t ( MemoryLayout< mach_task_basic_info> . size) / 4
36+
37+ let kerr : kern_return_t = withUnsafeMutablePointer ( to: & info) {
38+ $0. withMemoryRebound ( to: integer_t. self, capacity: 1 ) {
39+ task_info ( mach_task_self_,
40+ task_flavor_t ( MACH_TASK_BASIC_INFO) ,
41+ $0,
42+ & count)
43+ }
44+ }
45+
46+ if kerr == KERN_SUCCESS {
47+ let usedMB = Double ( info. resident_size) / 1024.0 / 1024.0
48+ log ( String ( format: " Memory used: %.2f MB " , usedMB) ,
49+ category: . memory,
50+ file: file,
51+ function: function,
52+ line: line)
53+ }
54+ }
55+ }
56+
57+ extension View {
58+ func trackLifecycle( _ identifier: String ) -> some View {
59+ self . modifier ( ViewLifecycleTracker ( identifier: identifier) )
60+ }
61+ }
62+
63+ struct ViewLifecycleTracker : ViewModifier {
64+ let identifier : String
65+
66+ func body( content: Content ) -> some View {
67+ content
68+ . onAppear {
69+ Logger . log ( " \( identifier) appeared " , category: . lifecycle)
70+ Logger . trackMemory ( )
71+ }
72+ . onDisappear {
73+ Logger . log ( " \( identifier) disappeared " , category: . lifecycle)
74+ Logger . trackMemory ( )
75+ }
76+ }
77+ }
0 commit comments