मैं स्विफ्ट 4 के डिकोडेबल प्रोटोकॉल के साथ कस्टम कुंजियों का उपयोग कैसे करूं?


102

स्विफ्ट 4 ने Decodableप्रोटोकॉल के माध्यम से देशी JSON एन्कोडिंग और डिकोडिंग के लिए समर्थन पेश किया । मैं इसके लिए कस्टम कुंजियों का उपयोग कैसे करूं?

उदाहरण के लिए, मेरे पास एक संरचना है

struct Address:Codable {
    var street:String
    var zip:String
    var city:String
    var state:String
}

मैं इसे JSON को एन्कोड कर सकता हूं।

let address = Address(street: "Apple Bay Street", zip: "94608", city: "Emeryville", state: "California")

if let encoded = try? encoder.encode(address) {
    if let json = String(data: encoded, encoding: .utf8) {
        // Print JSON String
        print(json)

        // JSON string is 
           { "state":"California", 
             "street":"Apple Bay Street", 
             "zip":"94608", 
             "city":"Emeryville" 
           }
    }
}

मैं एक वस्तु को वापस इनकोड कर सकता हूं।

    let newAddress: Address = try decoder.decode(Address.self, from: encoded)

लेकिन अगर मेरे पास एक json वस्तु थी जो थी

{ 
   "state":"California", 
   "street":"Apple Bay Street", 
   "zip_code":"94608", 
   "city":"Emeryville" 
}

मैं Addressउस zip_codeनक्शे पर डिकोडर को कैसे बताऊंगा zip? मेरा मानना ​​है कि आप नए CodingKeyप्रोटोकॉल का उपयोग करते हैं, लेकिन मैं यह नहीं जान सकता कि इसका उपयोग कैसे किया जाए।

जवाबों:


258

मैन्युअल रूप से कोडिंग कुंजी को अनुकूलित करना

आपके उदाहरण में, आपको स्वतः-जेनरेट की गई अनुरूपता मिल रही है Codableक्योंकि आपकी सभी संपत्तियाँ भी अनुरूप हैं Codable। यह अनुरूपता स्वचालित रूप से एक कुंजी प्रकार बनाती है जो बस संपत्ति के नामों से मेल खाती है - जो तब उपयोग किया जाता है ताकि एक एकल बंद कंटेनर से सांकेतिक शब्दों में बदलना / डिकोड किया जा सके।

हालांकि एक सच में यह स्वत: जनरेट अनुरूपता का साफ सुविधा है कि आप एक नेस्ट को परिभाषित करता है, तो enumअपने प्रकार "कहा जाता है में CodingKeys" (या एक का उपयोग typealiasइस नाम के साथ) है कि के अनुरूप CodingKeyप्रोटोकॉल - स्विफ्ट स्वचालित रूप से उपयोग करेगा इस कुंजी प्रकार के रूप में। इसलिए यह आपको उन कुंजियों को आसानी से कस्टमाइज़ करने की अनुमति देता है, जिनके साथ आपकी संपत्तियाँ एन्कोडेड / डिकोड की गई हैं।

तो इसका मतलब क्या है आप बस इतना कह सकते हैं:

struct Address : Codable {

    var street: String
    var zip: String
    var city: String
    var state: String

    private enum CodingKeys : String, CodingKey {
        case street, zip = "zip_code", city, state
    }
}

एनुम केस नामों को संपत्ति के नामों से मेल खाना चाहिए, और इन मामलों के कच्चे मूल्यों को उन कुंजियों से मेल खाना चाहिए, जिन्हें आप / से डिकोडिंग कर रहे हैं (जब तक कि अन्यथा निर्दिष्ट नहीं किया जाता है, तो Stringएन्यूमरेशन के कच्चे मान केस नामों के समान होंगे। )। इसलिए, zipअब कुंजी का उपयोग करके संपत्ति को एनकोड / डिकोड किया जाएगा "zip_code"

ऑटो-जनरेट Encodable/ Decodableअनुरूपता के सटीक नियम विकास प्रस्ताव (जोर मेरा) द्वारा विस्तृत हैं :

के लिए स्वत: CodingKeyआवश्यकता संश्लेषण के अलावा enums, Encodableऔर Decodableआवश्यकताओं को स्वचालित रूप से कुछ प्रकारों के लिए भी संश्लेषित किया जा सकता है:

  1. Encodableजिनके गुण के अनुरूप सभी प्रकार के नाम Encodableउत्पन्न करने के लिए स्वचालित रूप से उत्पन्न होने वाली Stringएनुम CodingKeyमैपिंग गुण हैं। इसी प्रकार के Decodableप्रकार जिनके गुण सभी हैंDecodable

  2. (1) में आने वाले प्रकारCodingKey enumCodingKeystypealiasEncodableDecodable - और प्रकार जो मैन्युअल रूप से एक (नाम , सीधे या एक के माध्यम से ) प्रदान करते हैं, जिनके मामले नाम से 1-से -1 / गुण का नक्शा करते हैं - उन गुणों और कुंजियों का उपयोग करके, init(from:)और encode(to:)जैसा कि उपयुक्त हो, के स्वत: संश्लेषण प्राप्त करें

  3. प्रकार जो न तो (1) और न ही (2) में आते हैं, यदि आवश्यक हो तो एक कस्टम कुंजी प्रकार प्रदान करना होगा init(from:)और अपने स्वयं के और encode(to:)उपयुक्त के रूप में प्रदान करना होगा

उदाहरण एन्कोडिंग:

import Foundation

let address = Address(street: "Apple Bay Street", zip: "94608",
                      city: "Emeryville", state: "California")

do {
    let encoded = try JSONEncoder().encode(address)
    print(String(decoding: encoded, as: UTF8.self))
} catch {
    print(error)
}
//{"state":"California","street":"Apple Bay Street","zip_code":"94608","city":"Emeryville"}

उदाहरण डिकोडिंग:

// using the """ multi-line string literal here, as introduced in SE-0168,
// to avoid escaping the quotation marks
let jsonString = """
{"state":"California","street":"Apple Bay Street","zip_code":"94608","city":"Emeryville"}
"""

do {
    let decoded = try JSONDecoder().decode(Address.self, from: Data(jsonString.utf8))
    print(decoded)
} catch {
    print(error)
}

// Address(street: "Apple Bay Street", zip: "94608",
// city: "Emeryville", state: "California")

संपत्ति के नाम के snake_caseलिए स्वचालित JSON कुंजियाँcamelCase

स्विफ्ट 4.1 में, यदि आप अपनी zipसंपत्ति का नाम बदल देते हैं, तो आप zipCodeकुंजी एन्कोडिंग / डिकोडिंग रणनीतियों का लाभ उठा सकते हैं JSONEncoderऔर JSONDecoderस्वचालित रूप से camelCaseऔर के बीच कोडिंग कुंजी को बदलने के लिए snake_case

उदाहरण एन्कोडिंग:

import Foundation

struct Address : Codable {
  var street: String
  var zipCode: String
  var city: String
  var state: String
}

let address = Address(street: "Apple Bay Street", zipCode: "94608",
                      city: "Emeryville", state: "California")

do {
  let encoder = JSONEncoder()
  encoder.keyEncodingStrategy = .convertToSnakeCase
  let encoded = try encoder.encode(address)
  print(String(decoding: encoded, as: UTF8.self))
} catch {
  print(error)
}
//{"state":"California","street":"Apple Bay Street","zip_code":"94608","city":"Emeryville"}

उदाहरण डिकोडिंग:

let jsonString = """
{"state":"California","street":"Apple Bay Street","zip_code":"94608","city":"Emeryville"}
"""

do {
  let decoder = JSONDecoder()
  decoder.keyDecodingStrategy = .convertFromSnakeCase
  let decoded = try decoder.decode(Address.self, from: Data(jsonString.utf8))
  print(decoded)
} catch {
  print(error)
}

// Address(street: "Apple Bay Street", zipCode: "94608",
// city: "Emeryville", state: "California")

इस रणनीति के बारे में ध्यान देने वाली एक महत्वपूर्ण बात यह है कि यह कुछ संपत्ति के नामों को राउंड-ट्रिप करने में सक्षम नहीं होगा, जो कि स्विफ्ट एपीआई डिजाइन दिशानिर्देशों के अनुसार , समान रूप से ऊपरी या निचले मामले (स्थिति के आधार पर) होना चाहिए )।

उदाहरण के लिए, एक संपत्ति का नाम someURLकुंजी के साथ एन्कोड किया जाएगा some_url, लेकिन डिकोडिंग पर, इसे बदल दिया जाएगा someUrl

इसे ठीक करने के लिए, आपको मैन्युअल रूप से उस प्रॉपर्टी के लिए कोडिंग कुंजी निर्दिष्ट करनी होगी जो कि डिकोडर को उम्मीद है, जैसे someUrlइस मामले में (जो अभी भी some_urlएनकोडर द्वारा बदल दिया जाएगा ):

struct S : Codable {

  private enum CodingKeys : String, CodingKey {
    case someURL = "someUrl", someOtherProperty
  }

  var someURL: String
  var someOtherProperty: String
}

(यह आपके विशिष्ट प्रश्न का कड़ाई से जवाब नहीं देता है, लेकिन इस प्रश्नोत्तर की विहित प्रकृति को देखते हुए, मुझे लगता है कि यह शामिल है)

कस्टम स्वचालित JSON कुंजी मैपिंग

स्विफ्ट 4.1 में, आप कस्टम कुंजी एन्कोडिंग / डिकोडिंग रणनीतियों का लाभ उठा सकते हैं JSONEncoderऔर JSONDecoder, आपको कोडन कुंजी को मैप करने के लिए एक कस्टम फ़ंक्शन प्रदान करने की अनुमति देता है।

आपके द्वारा प्रदान किया जाने वाला फ़ंक्शन एक लेता है [CodingKey], जो एन्कोडिंग / डिकोडिंग में वर्तमान बिंदु के लिए कोडिंग पथ का प्रतिनिधित्व करता है (ज्यादातर मामलों में, आपको केवल अंतिम तत्व पर विचार करने की आवश्यकता होगी; वह है, वर्तमान कुंजी)। फ़ंक्शन देता है CodingKeyजो इस सरणी में अंतिम कुंजी को बदल देगा।

उदाहरण के लिए, UpperCamelCaseJSON कुंजियाँlowerCamelCase संपत्ति के नाम के :

import Foundation

// wrapper to allow us to substitute our mapped string keys.
struct AnyCodingKey : CodingKey {

  var stringValue: String
  var intValue: Int?

  init(_ base: CodingKey) {
    self.init(stringValue: base.stringValue, intValue: base.intValue)
  }

  init(stringValue: String) {
    self.stringValue = stringValue
  }

  init(intValue: Int) {
    self.stringValue = "\(intValue)"
    self.intValue = intValue
  }

  init(stringValue: String, intValue: Int?) {
    self.stringValue = stringValue
    self.intValue = intValue
  }
}

extension JSONEncoder.KeyEncodingStrategy {

  static var convertToUpperCamelCase: JSONEncoder.KeyEncodingStrategy {
    return .custom { codingKeys in

      var key = AnyCodingKey(codingKeys.last!)

      // uppercase first letter
      if let firstChar = key.stringValue.first {
        let i = key.stringValue.startIndex
        key.stringValue.replaceSubrange(
          i ... i, with: String(firstChar).uppercased()
        )
      }
      return key
    }
  }
}

extension JSONDecoder.KeyDecodingStrategy {

  static var convertFromUpperCamelCase: JSONDecoder.KeyDecodingStrategy {
    return .custom { codingKeys in

      var key = AnyCodingKey(codingKeys.last!)

      // lowercase first letter
      if let firstChar = key.stringValue.first {
        let i = key.stringValue.startIndex
        key.stringValue.replaceSubrange(
          i ... i, with: String(firstChar).lowercased()
        )
      }
      return key
    }
  }
}

अब आप .convertToUpperCamelCaseमुख्य रणनीति के साथ सांकेतिक शब्दों में बदलना कर सकते हैं :

let address = Address(street: "Apple Bay Street", zipCode: "94608",
                      city: "Emeryville", state: "California")

do {
  let encoder = JSONEncoder()
  encoder.keyEncodingStrategy = .convertToUpperCamelCase
  let encoded = try encoder.encode(address)
  print(String(decoding: encoded, as: UTF8.self))
} catch {
  print(error)
}
//{"Street":"Apple Bay Street","City":"Emeryville","State":"California","ZipCode":"94608"}

और .convertFromUpperCamelCaseप्रमुख रणनीति के साथ डिकोड करें :

let jsonString = """
{"Street":"Apple Bay Street","City":"Emeryville","State":"California","ZipCode":"94608"}
"""

do {
  let decoder = JSONDecoder()
  decoder.keyDecodingStrategy = .convertFromUpperCamelCase
  let decoded = try decoder.decode(Address.self, from: Data(jsonString.utf8))
  print(decoded)
} catch {
  print(error)
}

// Address(street: "Apple Bay Street", zipCode: "94608",
// city: "Emeryville", state: "California")

बस खुद को इस पर ठोकर खाई! मुझे आश्चर्य है, क्या केवल एक कुंजी को ओवरराइड करने का एक तरीका है जिसे मैं बदलना चाहता हूं और बाकी को अकेला छोड़ दूं? उदाहरण के लिए, स्टेटमेंट में, CodingKeysएनम के नीचे ; क्या मैं सिर्फ एक कुंजी सूचीबद्ध कर सकता हूं जिसे मैं बदल रहा हूं?
१:04:०५ पर क्रिस्मसनर्सन

2
"""एक बहु-पंक्ति शाब्दिक के लिए है :)
मार्टिन आर

6
@MartinR या यहां तक ​​कि सिर्फ एक लाइन शाब्दिक से बचने के लिए बिना "s: D
Hamish

1
@chrismanderson सटीक - विशेष रूप से यह दिया गया है कि संकलक यह बताता है कि संपत्ति के नामों के साथ केस नामों को सिंक में रखा गया है (यह आपको एक त्रुटि देगा कह रहा है कि आप Codableअन्यथा के अनुरूप नहीं हैं)
हैमिश

1
@ClayEllis आह हाँ, हालांकि नेस्टेड कंटेनरों का उपयोग करने के लिए उदाहरण के लिए सीधे Addressअनावश्यक रूप से प्रारंभिक रूप से अपने आप को एक JSON ऑब्जेक्ट को डिकोड करने के लिए खुद को जोड़ता है जो मूल ऑब्जेक्ट ग्राफ़ में एक विशिष्ट स्थान पर शुरू होता है। यह डिकोडर तक के शुरुआती मुख्य पथ को सार करने के लिए बहुत अच्छा होगा - यहाँ एक मोटा हैकी-इश कार्यान्वयन है
हमीश

17

अपनी आवश्यकताओं के अनुसार स्विफ्ट 4.2 के साथ, आप अपने मॉडल ऑब्जेक्ट्स को अपने JSON कुंजियों से मेल खाने वाली कस्टम प्रॉपर्टी के नाम बनाने के लिए निम्नलिखित 3 रणनीतियों में से एक का उपयोग कर सकते हैं।


# 1। कस्टम कोडिंग कुंजी का उपयोग करना

जब आप निम्नलिखित कार्यान्वयन के साथ Codable( Decodableऔर Encodableप्रोटोकॉल) के अनुरूप एक संरचना की घोषणा करते हैं ...

struct Address: Codable {
    var street: String
    var zip: String
    var city: String
    var state: String        
}

... संकलक स्वचालित रूप से एक नेस्टेड एनम उत्पन्न करता है जो CodingKeyआपके लिए प्रोटोकॉल के अनुरूप है ।

struct Address: Codable {
    var street: String
    var zip: String
    var city: String
    var state: String

    // compiler generated
    private enum CodingKeys: String, CodingKey {
        case street
        case zip
        case city
        case state
    }
}

इसलिए, यदि आपके अनुक्रमित डेटा प्रारूप में उपयोग की जाने वाली कुंजियाँ आपके डेटा प्रकार से संपत्ति के नामों से मेल नहीं खाती हैं, तो आप मैन्युअल रूप से इस एनम को लागू कर सकते हैं और rawValueआवश्यक मामलों के लिए उपयुक्त सेट कर सकते हैं।

निम्न उदाहरण दिखाता है कि कैसे करें:

import Foundation

struct Address: Codable {
    var street: String
    var zip: String
    var city: String
    var state: String

    private enum CodingKeys: String, CodingKey {
        case street
        case zip = "zip_code"
        case city
        case state
    }
}

सांकेतिक शब्दों में बदलना ( zip"zip_code" JSON कुंजी के साथ संपत्ति बदलना ):

let address = Address(street: "Apple Bay Street", zip: "94608", city: "Emeryville", state: "California")

let encoder = JSONEncoder()
if let jsonData = try? encoder.encode(address), let jsonString = String(data: jsonData, encoding: .utf8) {
    print(jsonString)
}

/*
 prints:
 {"state":"California","street":"Apple Bay Street","zip_code":"94608","city":"Emeryville"}
 */

डिकोड ( zipसंपत्ति के साथ "zip_code" JSON कुंजी की जगह ):

let jsonString = """
{"state":"California","street":"Apple Bay Street","zip_code":"94608","city":"Emeryville"}
"""

let decoder = JSONDecoder()
if let jsonData = jsonString.data(using: .utf8), let address = try? decoder.decode(Address.self, from: jsonData) {
    print(address)
}

/*
 prints:
 Address(street: "Apple Bay Street", zip: "94608", city: "Emeryville", state: "California")
 */

# 2। सांप के मामले का उपयोग ऊंट के मामले की कुंजी कोडिंग रणनीतियों के लिए

आपके JSON साँप मामलों कुंजी है और आप अपने मॉडल वस्तु के लिए ऊंट मामलों गुण करने के लिए उन्हें परिवर्तित करना चाहते हैं, तो आप अपने सेट कर सकते हैं JSONEncoder'एस keyEncodingStrategyऔर JSONDecoderएस' keyDecodingStrategyके लिए गुण .convertToSnakeCase

निम्न उदाहरण दिखाता है कि कैसे करें:

import Foundation

struct Address: Codable {
    var street: String
    var zipCode: String
    var cityName: String
    var state: String
}

सांकेतिक शब्दों में बदलना JSON कुंजियों में सांकेतिक शब्दों में बदलना (ऊंट आवरण गुणों को परिवर्तित करना):

let address = Address(street: "Apple Bay Street", zipCode: "94608", cityName: "Emeryville", state: "California")

let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
if let jsonData = try? encoder.encode(address), let jsonString = String(data: jsonData, encoding: .utf8) {
    print(jsonString)
}

/*
 prints:
 {"state":"California","street":"Apple Bay Street","zip_code":"94608","city_name":"Emeryville"}
 */

डिकोड (ऊंट आवरण गुण में सांप के आवरण JSON कुंजियों को परिवर्तित करना):

let jsonString = """
{"state":"California","street":"Apple Bay Street","zip_code":"94608","city_name":"Emeryville"}
"""

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
if let jsonData = jsonString.data(using: .utf8), let address = try? decoder.decode(Address.self, from: jsonData) {
    print(address)
}

/*
 prints:
 Address(street: "Apple Bay Street", zipCode: "94608", cityName: "Emeryville", state: "California")
 */

# 3। कस्टम कुंजी कोडिंग रणनीतियों का उपयोग करना

यदि आवश्यक हो, JSONEncoderऔर JSONDecoderआपको कोडिंग कुंजी का उपयोग करके मैप करने के लिए एक कस्टम रणनीति सेट करने की अनुमति है JSONEncoder.KeyEncodingStrategy.custom(_:)और JSONDecoder.KeyDecodingStrategy.custom(_:)

निम्नलिखित उदाहरण दिखाता है कि उन्हें कैसे लागू किया जाए:

import Foundation

struct Address: Codable {
    var street: String
    var zip: String
    var city: String
    var state: String
}

struct AnyKey: CodingKey {
    var stringValue: String
    var intValue: Int?

    init?(stringValue: String) {
        self.stringValue = stringValue
    }

    init?(intValue: Int) {
        self.stringValue = String(intValue)
        self.intValue = intValue
    }
}

सांकेतिक शब्दों में बदलना (अपरकेस प्रथम अक्षर के गुणों को निचले अक्षर में परिवर्तित करना JSON कुंजियाँ):

let address = Address(street: "Apple Bay Street", zip: "94608", city: "Emeryville", state: "California")

let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .custom({ (keys) -> CodingKey in
    let lastKey = keys.last!
    guard lastKey.intValue == nil else { return lastKey }
    let stringValue = lastKey.stringValue.prefix(1).uppercased() + lastKey.stringValue.dropFirst()
    return AnyKey(stringValue: stringValue)!
})

if let jsonData = try? encoder.encode(address), let jsonString = String(data: jsonData, encoding: .utf8) {
    print(jsonString)
}

/*
 prints:
 {"Zip":"94608","Street":"Apple Bay Street","City":"Emeryville","State":"California"}
 */

डीकोड (अपरकेस पहला अक्षर JSON कुंजियों को निचले स्तर के पहले अक्षर गुणों में परिवर्तित करना):

let jsonString = """
{"State":"California","Street":"Apple Bay Street","Zip":"94608","City":"Emeryville"}
"""

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .custom({ (keys) -> CodingKey in
    let lastKey = keys.last!
    guard lastKey.intValue == nil else { return lastKey }
    let stringValue = lastKey.stringValue.prefix(1).lowercased() + lastKey.stringValue.dropFirst()
    return AnyKey(stringValue: stringValue)!
})

if let jsonData = jsonString.data(using: .utf8), let address = try? decoder.decode(Address.self, from: jsonData) {
    print(address)
}

/*
 prints:
 Address(street: "Apple Bay Street", zip: "94608", city: "Emeryville", state: "California")
 */

सूत्रों का कहना है:


3

मैंने जो कुछ किया है, वह उसी तरह की संरचना है जैसा कि आप अपने डेटा प्रकारों के संबंध में JSON से प्राप्त कर रहे हैं।

सिर्फ इस तरह:

struct Track {
let id : Int
let contributingArtistNames:String
let name : String
let albumName :String
let copyrightP:String
let copyrightC:String
let playlistCount:Int
let trackPopularity:Int
let playlistFollowerCount:Int
let artistFollowerCount : Int
let label : String
}

इसके बाद आपको उसी तरह के structविस्तार decodableऔर enumउसी संरचना के विस्तार का निर्माण करना होगा CodingKeyऔर फिर आपको इस कुंजी का उपयोग करके डिकोडर को इनिशियलाइज़ करना होगा। स्वयं संरचना से संदर्भित)

extension Track: Decodable {

    enum TrackCodingKeys: String, CodingKey {
        case id = "id"
        case contributingArtistNames = "primaryArtistsNames"
        case spotifyId = "spotifyId"
        case name = "name"
        case albumName = "albumName"
        case albumImageUrl = "albumImageUrl"
        case copyrightP = "copyrightP"
        case copyrightC = "copyrightC"
        case playlistCount = "playlistCount"
        case trackPopularity = "trackPopularity"
        case playlistFollowerCount = "playlistFollowerCount"
        case artistFollowerCount = "artistFollowers"
        case label = "label"
    }
    init(from decoder: Decoder) throws {
        let trackContainer = try decoder.container(keyedBy: TrackCodingKeys.self)
        if trackContainer.contains(.id){
            id = try trackContainer.decode(Int.self, forKey: .id)
        }else{
            id = 0
        }
        if trackContainer.contains(.contributingArtistNames){
            contributingArtistNames = try trackContainer.decode(String.self, forKey: .contributingArtistNames)
        }else{
            contributingArtistNames = ""
        }
        if trackContainer.contains(.spotifyId){
            spotifyId = try trackContainer.decode(String.self, forKey: .spotifyId)
        }else{
            spotifyId = ""
        }
        if trackContainer.contains(.name){
            name = try trackContainer.decode(String.self, forKey: .name)
        }else{
            name = ""
        }
        if trackContainer.contains(.albumName){
            albumName = try trackContainer.decode(String.self, forKey: .albumName)
        }else{
            albumName = ""
        }
        if trackContainer.contains(.albumImageUrl){
            albumImageUrl = try trackContainer.decode(String.self, forKey: .albumImageUrl)
        }else{
            albumImageUrl = ""
        }
        if trackContainer.contains(.copyrightP){
            copyrightP = try trackContainer.decode(String.self, forKey: .copyrightP)
        }else{
            copyrightP = ""
        }
        if trackContainer.contains(.copyrightC){
                copyrightC = try trackContainer.decode(String.self, forKey: .copyrightC)
        }else{
            copyrightC = ""
        }
        if trackContainer.contains(.playlistCount){
            playlistCount = try trackContainer.decode(Int.self, forKey: .playlistCount)
        }else{
            playlistCount = 0
        }

        if trackContainer.contains(.trackPopularity){
            trackPopularity = try trackContainer.decode(Int.self, forKey: .trackPopularity)
        }else{
            trackPopularity = 0
        }
        if trackContainer.contains(.playlistFollowerCount){
            playlistFollowerCount = try trackContainer.decode(Int.self, forKey: .playlistFollowerCount)
        }else{
            playlistFollowerCount = 0
        }

        if trackContainer.contains(.artistFollowerCount){
            artistFollowerCount = try trackContainer.decode(Int.self, forKey: .artistFollowerCount)
        }else{
            artistFollowerCount = 0
        }
        if trackContainer.contains(.label){
            label = try trackContainer.decode(String.self, forKey: .label)
        }else{
            label = ""
        }
    }
}

आपको अपनी आवश्यकताओं के अनुसार यहां प्रत्येक कुंजी और डेटाटाइप को बदलने और डिकोडर के साथ इसका उपयोग करने की आवश्यकता है।


-1

CodingKey का उपयोग करके आप कोडेबल या डीकोडेबल प्रोटोकॉल में कस्टम कुंजियों का उपयोग कर सकते हैं।

struct person: Codable {
    var name: String
    var age: Int
    var street: String
    var state: String

    private enum CodingKeys: String, CodingKey {
        case name
        case age
        case street = "Street_name"
        case state
    } }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.