44
55import Foundation
66
7+ protocol OptionalProtocol {
8+ var isNil : Bool { get }
9+ }
10+ extension Optional : OptionalProtocol {
11+ var isNil : Bool { self == nil }
12+ }
13+
714func canMirrorInto( _ reflecting: Any ? ) -> Bool {
815 if let _ = reflecting as? LookupRawValue {
916 return false
1017 }
1118 guard let ref = reflecting else { return false }
1219 let mirror = Mirror ( reflecting: ref)
1320 guard let displayStyle = mirror. displayStyle else { return false }
14- return ( displayStyle == . class || displayStyle == . struct)
21+ switch displayStyle {
22+ case . class, . struct:
23+ return true
24+ default :
25+ return canMirrorInto ( mirror. children. first? . value)
26+ }
1527}
1628
1729func mirrorValue( _ value: Any ) -> Any {
@@ -25,6 +37,34 @@ func mirrorValue(_ value: Any) -> Any {
2537 return " \( value) "
2638}
2739
40+ func unwrapValue( _ value: Any ) -> Any ? {
41+ let mirror = Mirror ( reflecting: value)
42+ if mirror. displayStyle == . optional {
43+ return mirror. children. first? . value
44+ }
45+ return value
46+ }
47+
48+ func mirrorArray( _ array: [ Any ] , _ each: ( ( _: String ? , _: Any ) -> Void ) ? ) -> [ Any ] {
49+ return array. compactMap { item in
50+ if let nested = item as? [ Any ] {
51+ let arr = mirrorArray ( nested, each)
52+ return arr. isEmpty ? nil : arr
53+ } else if canMirrorInto ( item) {
54+ let mirrored = mirrors ( reflecting: item, each)
55+ return mirrored. isEmpty ? nil : mirrored
56+ } else {
57+ let value = mirrorValue ( item)
58+ if let opt = value as? OptionalProtocol , opt. isNil {
59+ return nil
60+ } else if value is NSNull {
61+ return nil
62+ }
63+ return value
64+ }
65+ }
66+ }
67+
2868public func mirrors( reflecting: Any ? , _ each: ( ( _: String ? , _: Any ) -> Void ) ? = nil ) -> [ String : Any ] {
2969 guard let reflecting = reflecting else { return [ : ] }
3070
@@ -34,9 +74,36 @@ public func mirrors(reflecting: Any?, _ each: ((_: String?, _: Any) -> Void)? =
3474 for child in mirror. children {
3575 if let label = child. label, !label. isEmpty {
3676 if let unwrap = reflecting as? LookupUnwrap , let unwrapped = unwrap. lookupUnwrap ( key: label, value: child. value) {
37- map [ label] = mirrorValue ( unwrapped)
77+ let value = mirrorValue ( unwrapped)
78+ if let opt = value as? OptionalProtocol , opt. isNil {
79+ // skip
80+ } else if value is NSNull {
81+ // skip
82+ } else {
83+ map [ label] = value
84+ }
3885 } else {
39- map [ label] = canMirrorInto ( child. value) ? mirrors ( reflecting: child. value, each) : mirrorValue ( child. value)
86+ let value = unwrapValue ( child. value)
87+ if let array = value as? [ Any ] {
88+ let mirroredArray = mirrorArray ( array, each)
89+ if !mirroredArray. isEmpty {
90+ map [ label] = mirroredArray
91+ }
92+ } else if canMirrorInto ( value) {
93+ let mirroredDict = mirrors ( reflecting: value, each)
94+ if !mirroredDict. isEmpty {
95+ map [ label] = mirroredDict
96+ }
97+ } else {
98+ let value = mirrorValue ( child. value)
99+ if let opt = value as? OptionalProtocol , opt. isNil {
100+ // skip
101+ } else if value is NSNull {
102+ // skip
103+ } else {
104+ map [ label] = value
105+ }
106+ }
40107 }
41108 }
42109 each ? ( child. label, child. value)
@@ -47,9 +114,36 @@ public func mirrors(reflecting: Any?, _ each: ((_: String?, _: Any) -> Void)? =
47114 for child in superMirror!. children {
48115 if let label = child. label, !label. isEmpty {
49116 if let unwrap = reflecting as? LookupUnwrap , let unwrapped = unwrap. lookupUnwrap ( key: label, value: child. value) {
50- map [ label] = mirrorValue ( unwrapped)
117+ let value = mirrorValue ( unwrapped)
118+ if let opt = value as? OptionalProtocol , opt. isNil {
119+ // skip
120+ } else if value is NSNull {
121+ // skip
122+ } else {
123+ map [ label] = value
124+ }
51125 } else {
52- map [ label] = canMirrorInto ( child. value) ? mirrors ( reflecting: child. value, each) : mirrorValue ( child. value)
126+ let value = unwrapValue ( child. value)
127+ if let array = value as? [ Any ] {
128+ let mirroredArray = mirrorArray ( array, each)
129+ if !mirroredArray. isEmpty {
130+ map [ label] = mirroredArray
131+ }
132+ } else if canMirrorInto ( value) {
133+ let mirroredDict = mirrors ( reflecting: value, each)
134+ if !mirroredDict. isEmpty {
135+ map [ label] = mirroredDict
136+ }
137+ } else {
138+ let value = mirrorValue ( child. value)
139+ if let opt = value as? OptionalProtocol , opt. isNil {
140+ // skip
141+ } else if value is NSNull {
142+ // skip
143+ } else {
144+ map [ label] = value
145+ }
146+ }
53147 }
54148 }
55149 each ? ( child. label, child. value)
@@ -58,4 +152,3 @@ public func mirrors(reflecting: Any?, _ each: ((_: String?, _: Any) -> Void)? =
58152 }
59153 return map
60154}
61-
0 commit comments