| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /**
- A type-erased `Codable` value.
- The `AnyCodable` type forwards encoding and decoding responsibilities
- to an underlying value, hiding its specific underlying type.
- You can encode or decode mixed-type values in dictionaries
- and other collections that require `Encodable` or `Decodable` conformance
- by declaring their contained type to be `AnyCodable`.
- - SeeAlso: `AnyEncodable`
- - SeeAlso: `AnyDecodable`
- */
- import Foundation
- #if swift(>=5.1)
- @frozen public struct AnyCodable: Codable {
- public let value: Any
- public init<T>(_ value: T?) {
- self.value = value ?? ()
- }
- }
- #else
- public struct AnyCodable: Codable {
- public let value: Any
- public init<T>(_ value: T?) {
- self.value = value ?? ()
- }
- }
- #endif
- extension AnyCodable: _AnyEncodable, _AnyDecodable {}
- extension AnyCodable: Equatable {
- public static func == (lhs: AnyCodable, rhs: AnyCodable) -> Bool {
- switch (lhs.value, rhs.value) {
- case is (Void, Void):
- return true
- case let (lhs as Bool, rhs as Bool):
- return lhs == rhs
- case let (lhs as Int, rhs as Int):
- return lhs == rhs
- case let (lhs as Int8, rhs as Int8):
- return lhs == rhs
- case let (lhs as Int16, rhs as Int16):
- return lhs == rhs
- case let (lhs as Int32, rhs as Int32):
- return lhs == rhs
- case let (lhs as Int64, rhs as Int64):
- return lhs == rhs
- case let (lhs as UInt, rhs as UInt):
- return lhs == rhs
- case let (lhs as UInt8, rhs as UInt8):
- return lhs == rhs
- case let (lhs as UInt16, rhs as UInt16):
- return lhs == rhs
- case let (lhs as UInt32, rhs as UInt32):
- return lhs == rhs
- case let (lhs as UInt64, rhs as UInt64):
- return lhs == rhs
- case let (lhs as Decimal, rhs as Decimal):
- return lhs == rhs
- case let (lhs as Float, rhs as Float):
- return lhs == rhs
- case let (lhs as Double, rhs as Double):
- return lhs == rhs
- case let (lhs as String, rhs as String):
- return lhs == rhs
- case let (lhs as [String: AnyCodable], rhs as [String: AnyCodable]):
- return lhs == rhs
- case let (lhs as [AnyCodable], rhs as [AnyCodable]):
- return lhs == rhs
- default:
- return false
- }
- }
- }
- extension AnyCodable: CustomStringConvertible {
- public var description: String {
- switch value {
- case is Void:
- return String(describing: nil as Any?)
- case let value as CustomStringConvertible:
- return value.description
- default:
- return String(describing: value)
- }
- }
- }
- extension AnyCodable: CustomDebugStringConvertible {
- public var debugDescription: String {
- switch value {
- case let value as CustomDebugStringConvertible:
- return "AnyCodable(\(value.debugDescription))"
- default:
- return "AnyCodable(\(description))"
- }
- }
- }
- extension AnyCodable: ExpressibleByNilLiteral {}
- extension AnyCodable: ExpressibleByBooleanLiteral {}
- extension AnyCodable: ExpressibleByIntegerLiteral {}
- extension AnyCodable: ExpressibleByFloatLiteral {}
- extension AnyCodable: ExpressibleByStringLiteral {}
- extension AnyCodable: ExpressibleByArrayLiteral {}
- extension AnyCodable: ExpressibleByDictionaryLiteral {}
|