<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ccc M</title>
    <description>The latest articles on DEV Community by ccc M (@ccc_m_bfdfc93e9bbdfc53fbb).</description>
    <link>https://dev.to/ccc_m_bfdfc93e9bbdfc53fbb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3011536%2F36c44b97-cdb1-48aa-89a2-a789ad53e8a9.png</url>
      <title>DEV Community: ccc M</title>
      <link>https://dev.to/ccc_m_bfdfc93e9bbdfc53fbb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ccc_m_bfdfc93e9bbdfc53fbb"/>
    <language>en</language>
    <item>
      <title>SmartCodable - Ultimate Codable Enhancement for Swift</title>
      <dc:creator>ccc M</dc:creator>
      <pubDate>Thu, 03 Apr 2025 09:53:42 +0000</pubDate>
      <link>https://dev.to/ccc_m_bfdfc93e9bbdfc53fbb/smartcodable-ultimate-codable-enhancement-for-swift-4ocl</link>
      <guid>https://dev.to/ccc_m_bfdfc93e9bbdfc53fbb/smartcodable-ultimate-codable-enhancement-for-swift-4ocl</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/intsig171/SmartCodable" rel="noopener noreferrer"&gt;github address&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SmartCodable redefines Swift data parsing by augmenting Apple's native Codable with production-ready resilience and flexibility. Where standard Codable fails on real-world data, SmartCodable delivers bulletproof parsing with minimal boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;SmartCodable vs Codable&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature Category&lt;/th&gt;
&lt;th&gt;English Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Tolerance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Military-grade handling of type mismatches, null values, and missing keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type Adaptation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic bidirectional type conversion (String⇄Number, Number⇄Bool, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Default Value Fallback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Falls back to property initializers when parsing fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Mapping&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-source key mapping with priority system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Value Transformation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom value transformers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collection Safety&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Safe collection handling (empty arrays→nil, invalid elements→filtered)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deep Modelization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recursive modelization of nested JSON structures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dynamic Types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full support for &lt;code&gt;Any&lt;/code&gt;, &lt;code&gt;[Any]&lt;/code&gt;, &lt;code&gt;[String:Any]&lt;/code&gt; via &lt;code&gt;@SmartAny&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Naming Strategies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Global key strategies (snake_case⇄camelCase, capitalization)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lifecycle Hooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;didFinishMapping()&lt;/code&gt; callback for post-processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Incremental Updates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partial model updates without full re-parsing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Property Wrappers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;such as&lt;code&gt;@IgnoredKey&lt;/code&gt;, &lt;code&gt;@SmartFlat&lt;/code&gt;,&lt;code&gt;@SmartAny&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debugging Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in logging with path tracing for decoding errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Path Navigation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deep JSON access using dot notation (&lt;code&gt;designatedPath: "data.user"&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PropertyList Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native support for parsing PropertyList data without JSON conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parsing Diagnostics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time monitoring with &lt;code&gt;SmartSentinel.monitorLogs()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SmartCodable vs HandyJSON
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🎯 Feature&lt;/th&gt;
&lt;th&gt;💬 Description&lt;/th&gt;
&lt;th&gt;SmartCodable&lt;/th&gt;
&lt;th&gt;HandyJSON&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Strong Compatibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Perfectly handles: &lt;strong&gt;Missing fields&lt;/strong&gt; &amp;amp; &lt;strong&gt;Null values&lt;/strong&gt; &amp;amp; &lt;strong&gt;Type mismatches&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type Adaptation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic conversion between types (e.g., JSON Int to Model String)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Any Parsing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Supports parsing &lt;strong&gt;[Any], [String: Any]&lt;/strong&gt; types&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Decoding Callback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides &lt;strong&gt;didFinishingMapping&lt;/strong&gt; callback when model decoding completes&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Default Value Initialization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uses property's initial value when parsing fails&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;String-to-Model Parsing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Supports parsing JSON strings into models&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enum Parsing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides fallback for failed enum parsing&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Property Parsing - Renaming&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom decoding keys (renaming model properties)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Property Parsing - Ignoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ignores specific model properties during decoding&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;designatedPath Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom parsing paths&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model Inheritance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Codable has weaker support for inheritance (possible but inconvenient)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Parsing Paths&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Specifies starting JSON hierarchy level for parsing&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complex Data Decoding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Advanced data processing during decoding (e.g., data flattening)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Decoding Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SmartCodable averages 30% better performance&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Logging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides troubleshooting logs for compatibility handling&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Implementation stability and security&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you are using HandyJSON and would like to replace it, follow this link.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/intsig171/SmartCodable/blob/develop/Document/README/CompareWithHandyJSON.md" rel="noopener noreferrer"&gt;👉 &lt;strong&gt;SmartCodable - Compare With HandyJSON&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Advantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30% better performance&lt;/li&gt;
&lt;li&gt;More stable and secure implementation&lt;/li&gt;
&lt;li&gt;Built-in error diagnostics&lt;/li&gt;
&lt;li&gt;Superior complex data handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SmartCodable Supported Types Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Int&lt;/code&gt;, &lt;code&gt;Int8-64&lt;/code&gt;, &lt;code&gt;UInt&lt;/code&gt;, &lt;code&gt;UInt8-64&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Floating Point&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Float&lt;/code&gt;, &lt;code&gt;Double&lt;/code&gt;, &lt;code&gt;CGFloat&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Boolean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Bool&lt;/code&gt; (accepts &lt;code&gt;true&lt;/code&gt;/&lt;code&gt;1&lt;/code&gt;/&lt;code&gt;"true"&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;String&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;String&lt;/code&gt; (auto-converts from numbers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;URL&lt;/code&gt;, &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;Data&lt;/code&gt;, &lt;code&gt;UIColor&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enums&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All &lt;code&gt;RawRepresentable&lt;/code&gt; enums&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collections&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;[String: Codable]&lt;/code&gt;, &lt;code&gt;[Codable]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nested Models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any &lt;code&gt;Codable&lt;/code&gt; custom types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wrappers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@SmartAny&lt;/code&gt;, &lt;code&gt;@IgnoredKey&lt;/code&gt;, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Swift Package Manager
&lt;/h3&gt;

&lt;p&gt;Add to your &lt;code&gt;Package.swift&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies: [
    .package(url: "https://github.com/intsig171/SmartCodable.git")
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CocoaPods
&lt;/h3&gt;

&lt;p&gt;Add to your &lt;code&gt;Podfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pod 'SmartCodable'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage Examples
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import SmartCodable

struct User: SmartCodable {
    var name: String = ""
    var age: Int = 0
}
let user = User.deserialize(from: ["name": "John", "age": 30])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Deserialization
&lt;/h1&gt;

&lt;p&gt;To support deserialization from JSON, a class/struct need to conform to 'SmartCodable' protocol. &lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Basics
&lt;/h3&gt;

&lt;p&gt;To conform to 'SmartCodable', a class need to implement an empty initializer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class BasicTypes: SmartCodable {
    var int: Int = 2
    var doubleOptional: Double?
    required init() {}
}
let model = BasicTypes.deserialize(from: json)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The Struct
&lt;/h3&gt;

&lt;p&gt;For struct, since the compiler provide a default empty initializer, we use it for free.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct BasicTypes: SmartCodable {
    var int: Int = 2
    var doubleOptional: Double?
}
let model = BasicTypes.deserialize(from: json)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Support Property (need to be noticed)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  3.1 The Enum
&lt;/h4&gt;

&lt;p&gt;To be convertable, An &lt;code&gt;enum&lt;/code&gt; must conform to &lt;code&gt;SmartCaseDefaultable&lt;/code&gt; protocol. Nothing special need to do now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Student: SmartCodable {
    var name: String = ""
    var sex: Sex = .man

    enum Sex: String, SmartCaseDefaultable {
        case man = "man"
        case woman = "woman"
    }
}
let model = Student.deserialize(from: json)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Decoding of associative value enum
&lt;/h4&gt;

&lt;p&gt;Make the enumeration follow &lt;strong&gt;SmartAssociatedEnumerable&lt;/strong&gt;。Override the &lt;strong&gt;mappingForValue&lt;/strong&gt; method and take over the decoding process yourself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Model: SmartCodable {
    var sex: Sex = .man
    static func mappingForValue() -&amp;gt; [SmartValueTransformer]? {
        [
            CodingKeys.sex &amp;lt;--- RelationEnumTranformer()
        ]
    }
}

enum Sex: SmartAssociatedEnumerable {    
    case man
    case women
    case other(String)
}

struct RelationEnumTranformer: ValueTransformable {
    typealias Object = Sex
    typealias JSON = String

    func transformToJSON(_ value: Introduce_8ViewController.Sex?) -&amp;gt; String? {
        // do something
    }
    func transformFromJSON(_ value: Any?) -&amp;gt; Sex? {
        // do something
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3.2 SmartColor
&lt;/h4&gt;

&lt;p&gt;To decode hexadecimal colors, use SmartColor. Use &lt;code&gt;color.peel&lt;/code&gt; to get the UIColor object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Model: SmartCodable {
    var color: SmartColor = .color(UIColor.white)
}

let dict = [
    "color": "7DA5E3"
]
guard let model = Model.deserialize(from: dict) else { return }
print(model.color.peel)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. propertyWrapper
&lt;/h3&gt;

&lt;h4&gt;
  
  
  4.1 @SmartAny
&lt;/h4&gt;

&lt;p&gt;Codable does not support Any resolution, but can be implemented using @SmartAny。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Model: SmartCodable {
    @SmartAny var dict: [String: Any] = [:]
    @SmartAny var arr: [Any] = []
    @SmartAny var any: Any?
}
let dict: [String: Any] = [
    "dict": ["name": "Lisa"],
    "arr": [1,2,3],
    "any": "Mccc"
]

let model = Model.deserialize(from: dict)
print(model)
// Model(dict: ["name": "Lisa"], arr: [1, 2, 3], any: "Mccc")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.2 @IgnoredKey
&lt;/h4&gt;

&lt;p&gt;If you need to ignore the parsing of attributes, you can override &lt;code&gt;CodingKeys&lt;/code&gt; or use &lt;code&gt;@IgnoredKey&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Model: SmartCodable {
    @IgnoredKey
    var name: String = ""
}

let dict: [String: Any] = [
    "name": "Mccc"
]

let model = Model.deserialize(from: dict)
print(model)
// Model(name: "")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.3 @SmartFlat
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Model: SmartCodable {
    var name: String = ""
    var age: Int = 0

    @SmartFlat
    var model: FlatModel?

}
struct FlatModel: SmartCodable {
    var name: String = ""
    var age: Int = 0
}

let dict: [String: Any] =  [
    "name": "Mccc",
    "age": 18,
]

let model = Model.deserialize(from: dict)
print(model)
// Model(name: "Mccc", age: 18, model: FlatModel(name: "Mccc", age: 18))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.4 @SmartPublished
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class PublishedModel: ObservableObject, SmartCodable {
    required init() {}

    @SmartPublished
    var name: ABC?
}

struct ABC: SmartCodable {
    var a: String = ""
}

if let model = PublishedModel.deserialize(from: dict) {
    model.$name
        .sink { newName in
            print("name updated，newValue is: \(newName)")
        }
        .store(in: &amp;amp;cancellables)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Deserialization API
&lt;/h3&gt;

&lt;h4&gt;
  
  
  5.1 deserialize
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;
Only types conforming to &lt;code&gt;SmartCodable&lt;/code&gt; (or &lt;code&gt;[SmartCodable]&lt;/code&gt; for arrays) can use these methods&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input Flexibility&lt;/strong&gt;
Accepts multiple input formats:

&lt;ul&gt;
&lt;li&gt;Raw dictionaries/arrays (&lt;code&gt;[String: Any]&lt;/code&gt;/&lt;code&gt;[Any]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;JSON strings&lt;/li&gt;
&lt;li&gt;Binary &lt;code&gt;Data&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static func deserialize(from dict: [String: Any]?, designatedPath: String? = nil,  options: Set&amp;lt;SmartDecodingOption&amp;gt;? = nil) -&amp;gt; Self?

public static func deserialize(from json: String?, designatedPath: String? = nil, options: Set&amp;lt;SmartDecodingOption&amp;gt;? = nil) -&amp;gt; Self?

public static func deserialize(from data: Data?, designatedPath: String? = nil, options: Set&amp;lt;SmartDecodingOption&amp;gt;? = nil) -&amp;gt; Self?

public static func deserializePlist(from data: Data?, designatedPath: String? = nil, options: Set&amp;lt;SmartDecodingOption&amp;gt;? = nil) -&amp;gt; Self?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1. Multi-Format Input Support&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input Type&lt;/th&gt;
&lt;th&gt;Example Usage&lt;/th&gt;
&lt;th&gt;Internal Conversion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dictionary/Array&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Model.deserialize(from: dict or arr)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Directly processes native collections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON String&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Model.deserialize(from: jsonString)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Converts to &lt;code&gt;Data&lt;/code&gt; via UTF-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binary Data&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Model.deserialize(from: data)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Processes directly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2. Deep Path Navigation (&lt;code&gt;designatedPath&lt;/code&gt;)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// JSON Structure:
{
  "data": {
    "user": {
      "info": { ...target content... }
    }
  }
}

// Access nested data:
Model.deserialize(from: json, designatedPath: "data.user.info")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Path Resolution Rules:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dot-separated path components&lt;/li&gt;
&lt;li&gt;Handles both dictionaries and arrays&lt;/li&gt;
&lt;li&gt;Returns &lt;code&gt;nil&lt;/code&gt; if any path segment is invalid&lt;/li&gt;
&lt;li&gt;Empty path returns entire content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;3. Decoding Strategies (&lt;code&gt;options&lt;/code&gt;)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let options: Set&amp;lt;SmartDecodingOption&amp;gt; = [
    .key(.convertFromSnakeCase),
    .date(.iso8601),
    .data(.base64)
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy Type&lt;/th&gt;
&lt;th&gt;Available Options&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Decoding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.fromSnakeCase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;snake_case → camelCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.firstLetterLower&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"FirstName" → "firstName"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.firstLetterUpper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"firstName" → "FirstName"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Date Decoding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.iso8601&lt;/code&gt;, &lt;code&gt;.secondsSince1970&lt;/code&gt;, etc.&lt;/td&gt;
&lt;td&gt;Full Codable date strategies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Decoding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.base64&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Binary data processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Float Decoding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.convertToString&lt;/code&gt;, &lt;code&gt;.throw&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;NaN/∞ handling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important&lt;/strong&gt;: Only one strategy per type is allowed (last one wins if duplicates exist)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  5.2 Post-processing callback invoked after successful decoding
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Model: SmartCodable {
    var name: String = ""
    mutating func didFinishMapping() {
        name = "I am \(name)"
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5.2 Key Transformation
&lt;/h4&gt;

&lt;p&gt;Defines key mapping transformations during decoding，First non-null mapping is preferred。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;static func mappingForKey() -&amp;gt; [SmartKeyTransformer]? {
    return [
        CodingKeys.id &amp;lt;--- ["user_id", "userId", "id"],
        CodingKeys.joinDate &amp;lt;--- "joined_at"
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5.3 &lt;strong&gt;Value Transformation&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Convert between JSON values and custom types&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in Value Transformers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transformer&lt;/th&gt;
&lt;th&gt;JSON Type&lt;/th&gt;
&lt;th&gt;Object Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SmartDataTransformer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;Converts between Base64 strings and Data objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SmartHexColorTransformer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;ColorObject&lt;/td&gt;
&lt;td&gt;Converts hex color strings to platform-specific color objects (UIColor/NSColor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SmartDateTransformer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Double/String&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Handles multiple date formats (timestamp Double or String) to Date objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SmartDateFormatTransformer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Uses DateFormatter for custom date string formats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SmartURLTransformer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;Converts strings to URLs with optional encoding and prefixing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Model: SmartCodable {

    ...

    static func mappingForValue() -&amp;gt; [SmartValueTransformer]? {
        let format = DateFormatter()
        format.dateFormat = "yyyy-MM-dd"
        return [
            CodingKeys.url &amp;lt;--- SmartURLTransformer(prefix: "https://"),
            CodingKeys.date2 &amp;lt;--- SmartDateTransformer(),
            CodingKeys.date1 &amp;lt;--- SmartDateFormatTransformer(format)
        ]
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need additional parsing rules, &lt;strong&gt;Transformer&lt;/strong&gt; will implement them yourself. Follow &lt;strong&gt;ValueTransformable&lt;/strong&gt; to implement the requirements of the protocol.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public protocol ValueTransformable {
    associatedtype Object
    associatedtype JSON

    /// transform from ’json‘ to ’object‘
    func transformFromJSON(_ value: Any?) -&amp;gt; Object?

    /// transform to ‘json’ from ‘object’
    func transformToJSON(_ value: Object?) -&amp;gt; JSON?
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Built-in Fast Transformer Helper&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;static func mappingForValue() -&amp;gt; [SmartValueTransformer]? {
    [
        CodingKeys.name &amp;lt;--- FastTransformer&amp;lt;String, String&amp;gt;(fromJSON: { json in
            "abc"
        }, toJSON: { object in
            "123"
        }),
        CodingKeys.subModel &amp;lt;--- FastTransformer&amp;lt;TestEnum, String&amp;gt;(fromJSON: { json in
            TestEnum.man
        }, toJSON: { object in
            object?.rawValue
        }),
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5.4 Update Existing Model
&lt;/h4&gt;

&lt;p&gt;It can accommodate any data structure, including nested array structures.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Model: SmartCodable {
    var name: String = ""
    var age: Int = 0
}

var dic1: [String : Any] = [
    "name": "mccc",
    "age": 10
]
let dic2: [String : Any] = [
    "age": 200
]
guard var model = Model.deserialize(from: dic1) else { return }
SmartUpdater.update(&amp;amp;model, from: dic2)

// now: model is ["name": mccc, "age": 200].
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Special support
&lt;/h3&gt;

&lt;h4&gt;
  
  
  6.1 Smart Stringified JSON Parsing
&lt;/h4&gt;

&lt;p&gt;SmartCodable automatically handles string-encoded JSON values during decoding, seamlessly converting them into nested model objects or arrays while maintaining all key mapping rules.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Parsing&lt;/strong&gt;: Detects and decodes stringified JSON (&lt;code&gt;"{\"key\":value}"&lt;/code&gt;) into proper objects/arrays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursive Mapping&lt;/strong&gt;: Applies &lt;code&gt;mappingForKey()&lt;/code&gt; rules to parsed nested structures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type Inference&lt;/strong&gt;: Determines parsing strategy (object/array) based on property type
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Model: SmartCodable {
    var hobby: Hobby?
    var hobbys: [Hobby]?
}

struct Hobby: SmartCodable {
    var name: String = ""
}

let dict: [String: Any] = [
    "hobby": "{\"name\":\"sleep1\"}",
    "hobbys": "[{\"name\":\"sleep2\"}]",
]

guard let model = Model.deserialize(from: dict) else { return }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  6.2 Compatibility
&lt;/h4&gt;

&lt;p&gt;If attribute resolution fails, SmartCodable performs compatibility processing for thrown exceptions. Ensure that the entire parsing is not interrupted. Even better, you don't have to do anything about it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let dict = [
    "number1": "123",
    "number2": "Mccc",
    "number3": "Mccc"
]

struct Model: SmartCodable {
    var number1: Int?
    var number2: Int?
    var number3: Int = 1
}

// decode result
// Model(number1: 123, number2: nil, number3: 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Type conversion compatibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When the data is parsed, the type cannot be matched. Raises a.typeMismatch error. SmartCodable will attempt to convert data of type String to the desired type Int.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Default Fill compatible&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When the type conversion fails, the initialization value of the currently parsed property is retrieved for padding.&lt;/p&gt;

&lt;h4&gt;
  
  
  6.3 parse very large data
&lt;/h4&gt;

&lt;p&gt;When you parse very large data, try to avoid the compatibility of parsing exceptions, such as: more than one attribute is declared in the attribute, and the declared attribute type does not match. &lt;/p&gt;

&lt;p&gt;Do not use @IgnoredKey when there are attributes that do not need to be parsed, override CodingKeys to ignore unwanted attribute parsing. &lt;/p&gt;

&lt;p&gt;This can greatly improve the analytical efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sentinel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;SmartCodable is integrated with Smart Sentinel, which listens to the entire parsing process. After the parsing is complete, formatted log information is displayed. &lt;/p&gt;

&lt;p&gt;This information is used only as auxiliary information to help you discover and rectify problems. This does not mean that the parsing failed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;================================  [Smart Sentinel]  ================================
Array&amp;lt;SomeModel&amp;gt; 👈🏻 👀
   ╆━ Index 0
      ┆┄ a: Expected to decode 'Int' but found ‘String’ instead.
      ┆┄ b: Expected to decode 'Int' but found ’Array‘ instead.
      ┆┄ c: No value associated with key.
      ╆━ sub: SubModel
         ┆┄ sub_a: No value associated with key.
         ┆┄ sub_b: No value associated with key.
         ┆┄ sub_c: No value associated with key.
      ╆━ sub2s: [SubTwoModel]
         ╆━ Index 0
            ┆┄ sub2_a: No value associated with key.
            ┆┄ sub2_b: No value associated with key.
            ┆┄ sub2_c: No value associated with key.
         ╆━ Index 1
            ┆┄ sub2_a: Expected to decode 'Int' but found ’Array‘ instead.
   ╆━ Index 1
      ┆┄ a: No value associated with key.
      ┆┄ b: Expected to decode 'Int' but found ‘String’ instead.
      ┆┄ c: Expected to decode 'Int' but found ’Array‘ instead.
      ╆━ sub: SubModel
         ┆┄ sub_a: Expected to decode 'Int' but found ‘String’ instead.
      ╆━ sub2s: [SubTwoModel]
         ╆━ Index 0
            ┆┄ sub2_a: Expected to decode 'Int' but found ‘String’ instead.
         ╆━ Index 1
            ┆┄ sub2_a: Expected to decode 'Int' but found 'null' instead.
====================================================================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to use it, turn it on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SmartSentinel.debugMode = .verbose
public enum Level: Int {
    case none
    case verbose
    case alert
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to get this log to upload to the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SmartSentinel.onLogGenerated { logs in  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>swift</category>
      <category>codable</category>
      <category>json</category>
    </item>
  </channel>
</rss>
