@@ -36,36 +36,58 @@ enum Metadata {
3636 /// - Parameter data: The value to describe
3737 /// - Returns: Dictionary with type information about the value (for Stencil context)
3838 static func generate( for data: Any ) -> [ String : Any ] {
39- switch data {
40- case is String :
39+ let dataType = type ( of: data)
40+
41+ if data is String {
4142 return [ Key . type: ValueType . string]
42- case is Bool :
43+ } else if dataType == Bool . self {
4344 return [ Key . type: ValueType . bool]
44- case is Int :
45+ } else if dataType == Int . self {
4546 return [ Key . type: ValueType . int]
46- case is Double :
47+ } else if dataType == Double . self {
4748 return [ Key . type: ValueType . double]
48- case is Date :
49+ } else if dataType == Date . self {
4950 return [ Key . type: ValueType . date]
50- case is Data :
51+ } else if dataType == Data . self {
5152 return [ Key . type: ValueType . data]
52- case let data as [ Any ] :
53+ } else if let data = data as? NSNumber {
54+ return generate ( for: data)
55+ } else if let data = data as? [ Any ] {
5356 return [
5457 Key . type: ValueType . array,
5558 Key . element: Metadata . describe ( arrayElement: data)
5659 ]
57- case let data as [ String : Any ] :
60+ } else if let data = data as? [ String : Any ] {
5861 return [
5962 Key . type: ValueType . dictionary,
6063 Key . properties: Metadata . describe ( dictionary: data)
6164 ]
62- case is NSNull , nil :
65+ } else if dataType == NSNull . self || Mirror ( reflecting : data ) . displayStyle == . optional {
6366 return [ Key . type: ValueType . optional]
64- default :
67+ } else {
6568 return [ Key . type: ValueType . any]
6669 }
6770 }
6871
72+ static func generate( for number: NSNumber ) -> [ String : Any ] {
73+ if CFGetTypeID ( number) == CFBooleanGetTypeID ( ) {
74+ return [ Key . type: ValueType . bool]
75+ } else {
76+ switch CFNumberGetType ( number) {
77+ case . sInt8Type, . sInt16Type, . sInt32Type, . sInt64Type, . charType, . intType, . longType, . longLongType:
78+ return [ Key . type: ValueType . int]
79+ case . float32Type, . float64Type, . floatType, . doubleType:
80+ return [ Key . type: ValueType . double]
81+ case . nsIntegerType:
82+ return [ Key . type: ValueType . int]
83+ case . cgFloatType:
84+ return [ Key . type: ValueType . double]
85+ default :
86+ return [ Key . type: ValueType . any]
87+ }
88+ }
89+ }
90+
6991 private static func describe( dictionary: [ String : Any ] ) -> [ String : Any ] {
7092 Dictionary (
7193 uniqueKeysWithValues: dictionary. map { item in
0 commit comments