OSDN Git Service

洋上補給の補強増設用のショートネームをつけた
[kcd/KCD.git] / KCD / Debug.swift
1 //
2 //  Debug.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/02/12.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10
11 final class Debug {
12     
13     enum Level: Int {
14         
15         case none
16         case test
17         case debug
18         case full
19         
20         func higher(other: Level) -> Bool {
21             
22             return self.rawValue >= other.rawValue
23         }
24     }
25     
26     private struct Args: CustomStringConvertible, CustomDebugStringConvertible {
27         
28         let args: [Any]
29         let separator: String
30         
31         var description: String {
32             
33             return args.map { "\($0)" }.joined(separator: separator)
34         }
35         
36         var debugDescription: String {
37             
38             return args
39                 .map { ($0 as? CustomDebugStringConvertible)?.debugDescription ?? "\($0)" }
40                 .joined(separator: separator)
41         }
42     }
43     
44     class func print(_ items: Any..., separator: String = " ", terminator: String = "\n", level: Level = .debug) {
45         
46             excute(level: level) {
47                 
48                 Swift.print(Args(args: items, separator: separator), separator: separator, terminator: terminator)
49             }
50     }
51     
52     class func debugPrint(_ items: Any..., separator: String = " ", terminator: String = "\n", level: Level = .debug) {
53         
54             excute(level: level) {
55                 
56                 Swift.debugPrint(Args(args: items, separator: separator), separator: separator, terminator: terminator)
57             }
58     }
59     
60     class func dump<T>(_ value: T, name: String? = nil, indent: Int = 0, maxDepth: Int = Int.max, maxItems: Int = Int.max) -> T {
61         
62         #if DEBUG
63             return Swift.dump(value, name: name, indent: indent, maxDepth: maxDepth, maxItems: maxItems)
64         #else
65             return value
66         #endif
67     }
68     
69     class func excute(level: Level, f: () -> Void) {
70         
71         if UserDefaults.standard[.degugPrintLevel].higher(other: level) {
72             
73             f()
74         }
75     }
76 }