আমি কীভাবে সুইফট 4 এর ডিকোডেবল প্রোটোকল দিয়ে কাস্টম কী ব্যবহার করব?


105

সুইট 4 Decodableপ্রোটোকলের মাধ্যমে নেটিভ জেএসএন এনকোডিং এবং ডিকোডিংয়ের জন্য সমর্থন প্রবর্তন করেছে । আমি কীভাবে এর জন্য কাস্টম কী ব্যবহার করব?

উদাহরণস্বরূপ, বলুন আমি একটি কাঠামো আছে

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)

তবে আমার যদি কোনও জেসন বস্তু ছিল তা

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

আমি কীভাবে Addressসেই zip_codeমানচিত্রের ডিকোডারকে বলব zip? আমি বিশ্বাস করি আপনি নতুন CodingKeyপ্রোটোকলটি ব্যবহার করেন তবে কীভাবে এটি ব্যবহার করবেন তা আমি বুঝতে পারি না।

উত্তর:


266

কোডিং কীগুলি ম্যানুয়ালি কাস্টমাইজ করুন

আপনার উদাহরণস্বরূপ, আপনার Codableসমস্ত বৈশিষ্ট্য যেমন মেনে চলে তেমন আপনি একটি স্বয়ংক্রিয়-উত্পাদিত কনফারেন্স পেয়ে যাচ্ছেন Codable। এই সংমিশ্রণটি স্বয়ংক্রিয়ভাবে একটি মূল ধরণের তৈরি করে যা সম্পত্তির নামগুলির সাথে সাদৃশ্যপূর্ণ - যা পরে একক কীড ধারক থেকে / ডিকোড করার জন্য ব্যবহৃত হয় to

তবে এই অটো-উত্পাদিত কনফারেন্সটির সত্যই একটি ঝরঝরে বৈশিষ্ট্য হ'ল আপনি যদি প্রোটোকলের সাথে সঙ্গতিপূর্ণ 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 enum(নামে CodingKeysসরাসরি, বা এর মাধ্যমে একটি typealias) যাদের ক্ষেত্রে মানচিত্র 1 টু 1 Encodable/ Decodableনামে বৈশিষ্ট্য - স্বয়ংক্রিয় সংশ্লেষণ পেতে 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 কী ম্যাপিং

সুইফট ৪.১-এ আপনি কাস্টম কী এনকোডিং / ডিকোডিং কৌশলগুলি ব্যবহার করতে পারেন JSONEncoderএবং JSONDecoderকোডিং কীগুলি ম্যাপ করার জন্য আপনাকে একটি কাস্টম ফাংশন সরবরাহ করতে পারবেন।

আপনার [CodingKey]প্রদত্ত ফাংশনটি একটি নেয় যা এনকোডিং / ডিকোডিংয়ের বর্তমান পয়েন্টের কোডিং পথের প্রতিনিধিত্ব করে (বেশিরভাগ ক্ষেত্রে আপনাকে কেবলমাত্র শেষ উপাদানটি বিবেচনা করতে হবে; এটি বর্তমান কী)। ফাংশনটি একটি প্রদান করে CodingKeyযা এই অ্যারেতে শেষ কীটি প্রতিস্থাপন করবে।

উদাহরণস্বরূপ, সম্পত্তি নামের UpperCamelCaseজন্য JSON কীগুলি 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এনামের অধীনে কেস স্টেটমেন্টে ; আমি কী পরিবর্তিত হচ্ছি তার একটি কী তালিকাতে পারি?
ক্রিসম্যান্ডারসন

4
"""একটি বহু-লাইন আক্ষরিক জন্য :)
মার্টিন আর

6
@ মার্টিনআর বা এমনকি কেবল একটি একক লাইন আক্ষরিক না থেকে "এস: ডি
হামিশ

4
@ ক্রিসম্যান্ডারসন হুবহু - বিশেষত প্রদত্ত যে সংকলকটি জবাব দেয় যে মামলার নামগুলি সম্পত্তির নামগুলির সাথে সিঙ্কে রাখা হয় (এটি আপনাকে ত্রুটি দেবে আপনি Codableঅন্যথায়
হামিশ

4
@ ক্লেইলিস হ্যাঁ হ্যাঁ, অবশ্যই অবশ্যই নেস্টেড কনটেইনারগুলি ব্যবহার করে উদাহরণস্বরূপ সরাসরি Addressঅহেতুক প্রারম্ভকালে নিজেকে জেএসওএন অবজেক্টটি ডিকোডিংয়ের সাথে যুক্ত করে যা প্যারেন্ট অবজেক্ট গ্রাফের একটি নির্দিষ্ট জায়গায় শুরু হয়। ডিকোডার নিজেই শুরু করার মূল পথটি বিমূর্ত করা অনেক সুন্দর হবে - এখানে হ্যাকি-ইশ বাস্তবের বাস্তবায়ন রয়েছে
হামিশ

17

আপনার প্রয়োজন অনুসারে সুইফট ৪.২ এর সাহায্যে আপনার মডেল অবজেক্টগুলিকে কাস্টম সম্পত্তির নামগুলি আপনার জেএসএন কীগুলির সাথে মেলে দেওয়ার জন্য আপনি নিম্নলিখিত 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"জিপ_কোড" জেএসএন কী দিয়ে সম্পত্তি প্রতিস্থাপন করা ):

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"}
 */

ডিকোড ("জিপ_কোড" JSON কীটি zipসম্পত্তি সহ প্রতিস্থাপন করা ):

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 সাপ-cased কী হয়েছে এবং আপনি আপনার মডেল বস্তুর জন্য উট-cased বৈশিষ্ট্য তাদের রূপান্তর করতে চান, তাহলে আপনি আপনার সেট করতে পারেন JSONEncoder'গুলি keyEncodingStrategyএবং JSONDecoders' এর keyDecodingStrategyবৈশিষ্ট্য .convertToSnakeCase

নিম্নলিখিত উদাহরণটি কীভাবে করবেন তা দেখায়:

import Foundation

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

এনকোড (উটের কেসযুক্ত বৈশিষ্ট্যগুলি সাপের কেস জেএসএন কীগুলিতে রূপান্তর করা):

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"}
 */

ডিকোড (সাপের কেসযুক্ত জেএসওএন কীগুলি উটের কেসযুক্ত বৈশিষ্ট্যে রূপান্তর করা):

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
    }
}

এনকোড (ছোট অক্ষরের প্রথম অক্ষরের বৈশিষ্ট্যগুলি বড় বড় অক্ষর জেএসএন কীগুলিতে রূপান্তর করা):

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"}
 */

ডিকোড (বড় অক্ষরের প্রথম অক্ষরের জেএসওএন কীগুলি নিম্নের প্রথম অক্ষরের বৈশিষ্ট্যে রূপান্তর করা):

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

আমি যা করেছি তা হ'ল জেএসওএন থেকে এটির উপাত্তের প্রকারের মতো আপনি কীভাবে যাচ্ছেন তার মতো নিজস্ব কাঠামো তৈরি করা।

ঠিক এই রকম:

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

কোডিংকি ব্যবহার করে আপনি কোডেবল বা ডিকোডেবল প্রোটোকলে কাস্টম কী ব্যবহার করতে পারেন।

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
    } }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.