@@ -53,16 +53,16 @@ extension _AnyEncodable {
53
53
54
54
var container = encoder. singleValueContainer ( )
55
55
switch self . value {
56
- case let dictionary as [ String : Any ? ] :
57
- try container . encode ( dictionary . mapValues { AnyCodable ( $0 ) } )
58
- case let array as [ Any ? ] :
59
- try container . encode ( array . map { AnyCodable ( $0 ) } )
60
- case let url as URL :
61
- try container . encode ( url )
62
- case let string as String :
63
- try container. encode ( string )
64
- case let date as Date :
65
- try container. encode ( date )
56
+ #if canImport(Foundation)
57
+ case let number as NSNumber :
58
+ try encode ( nsnumber : number , into : & container )
59
+ case is NSNull :
60
+ try container . encodeNil ( )
61
+ #endif
62
+ case is Void :
63
+ try container. encodeNil ( )
64
+ case let bool as Bool :
65
+ try container. encode ( bool )
66
66
case let int as Int :
67
67
try container. encode ( int)
68
68
case let int8 as Int8 :
@@ -87,44 +87,55 @@ extension _AnyEncodable {
87
87
try container. encode ( float)
88
88
case let double as Double :
89
89
try container. encode ( double)
90
- case let bool as Bool :
91
- try container. encode ( bool)
92
- case is Void :
93
- try container. encodeNil ( )
90
+ case let string as String :
91
+ try container. encode ( string)
92
+ #if canImport(Foundation)
93
+ case let date as Date :
94
+ try container. encode ( date)
95
+ case let url as URL :
96
+ try container. encode ( url)
97
+ #endif
98
+ case let array as [ Any ? ] :
99
+ try container. encode ( array. map { AnyEncodable ( $0) } )
100
+ case let dictionary as [ String : Any ? ] :
101
+ try container. encode ( dictionary. mapValues { AnyEncodable ( $0) } )
94
102
default :
95
103
let context = EncodingError . Context ( codingPath: container. codingPath,
96
- debugDescription: " AnyCodable value cannot be encoded" )
97
- throw EncodingError . invalidValue ( self . value, context)
104
+ debugDescription: " AnyEncodable value cannot be encoded" )
105
+ throw EncodingError . invalidValue ( value, context)
98
106
}
99
107
}
100
108
101
- #if !os(Linux) && !os(Android )
102
- private func encode( nsnumber: NSNumber , into container: inout SingleValueEncodingContainer ) throws { // swiftlint:disable:this cyclomatic_complexity line_length
103
- switch CFNumberGetType ( nsnumber) {
104
- case . charType :
109
+ #if canImport(Foundation )
110
+ private func encode( nsnumber: NSNumber , into container: inout SingleValueEncodingContainer ) throws {
111
+ switch Character ( Unicode . Scalar ( UInt8 ( nsnumber. objCType . pointee ) ) ) {
112
+ case " c " , " C " :
105
113
try container. encode ( nsnumber. boolValue)
106
- case . sInt8Type :
114
+ case " s " :
107
115
try container. encode ( nsnumber. int8Value)
108
- case . sInt16Type :
116
+ case " i " :
109
117
try container. encode ( nsnumber. int16Value)
110
- case . sInt32Type :
118
+ case " l " :
111
119
try container. encode ( nsnumber. int32Value)
112
- case . sInt64Type :
120
+ case " q " :
113
121
try container. encode ( nsnumber. int64Value)
114
- case . shortType:
122
+ case " S " :
123
+ try container. encode ( nsnumber. uint8Value)
124
+ case " I " :
115
125
try container. encode ( nsnumber. uint16Value)
116
- case . longType :
126
+ case " L " :
117
127
try container. encode ( nsnumber. uint32Value)
118
- case . longLongType :
128
+ case " Q " :
119
129
try container. encode ( nsnumber. uint64Value)
120
- case . intType, . nsIntegerType, . cfIndexType:
121
- try container. encode ( nsnumber. intValue)
122
- case . floatType, . float32Type:
130
+ case " f " :
123
131
try container. encode ( nsnumber. floatValue)
124
- case . doubleType , . float64Type , . cgFloatType :
132
+ case " d " :
125
133
try container. encode ( nsnumber. doubleValue)
126
- @unknown default :
127
- fatalError ( )
134
+ default :
135
+ let context = EncodingError . Context ( codingPath: container. codingPath,
136
+ // swiftlint:disable:next line_length
137
+ debugDescription: " NSNumber cannot be encoded because its type is not handled " )
138
+ throw EncodingError . invalidValue ( nsnumber, context)
128
139
}
129
140
}
130
141
#endif
@@ -202,11 +213,12 @@ extension AnyEncodable: ExpressibleByBooleanLiteral {}
202
213
extension AnyEncodable : ExpressibleByIntegerLiteral { }
203
214
extension AnyEncodable : ExpressibleByFloatLiteral { }
204
215
extension AnyEncodable : ExpressibleByStringLiteral { }
216
+ extension AnyEncodable : ExpressibleByStringInterpolation { }
205
217
extension AnyEncodable : ExpressibleByArrayLiteral { }
206
218
extension AnyEncodable : ExpressibleByDictionaryLiteral { }
207
219
208
220
extension _AnyEncodable {
209
- init ( nilLiteral: ( ) ) {
221
+ init ( nilLiteral _ : ( ) ) {
210
222
self . init ( nil as Any ? )
211
223
}
212
224
0 commit comments