কোডিং কীগুলি ম্যানুয়ালি কাস্টমাইজ করুন
আপনার উদাহরণস্বরূপ, আপনার 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প্রয়োজনীয়তা এছাড়াও স্বয়ংক্রিয়ভাবে নির্দিষ্ট ধরণের জন্য সংশ্লেষ করা যেতে পারে:
প্রকারের Encodableসম্পত্তি অনুসারে প্রকারভেদগুলি কেস নামের সাথে Encodableস্বয়ংক্রিয়ভাবে উত্পন্ন- Stringব্যাকড CodingKeyএনাম ম্যাপিং বৈশিষ্ট্যগুলি পেয়ে থাকে। একই Decodableধরণের ধরণের জন্য যার সম্পত্তি সমস্তDecodable
প্রকারভেদ (1) পতিত - যা নিজে এবং ধরনের একটি CodingKey enum(নামে CodingKeysসরাসরি, বা এর মাধ্যমে একটি typealias) যাদের ক্ষেত্রে মানচিত্র 1 টু 1 Encodable/ Decodableনামে বৈশিষ্ট্য - স্বয়ংক্রিয় সংশ্লেষণ পেতে init(from:)এবং encode(to:)যথাযথ হিসাবে, যারা বৈশিষ্ট্য এবং কীগুলি ব্যবহার করে
যে প্রকারগুলি (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)
}
ডিকোডিংয়ের উদাহরণ:
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)
}
সম্পত্তির নামের 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)
}
ডিকোডিংয়ের উদাহরণ:
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)
}
তবে এই কৌশলটি সম্পর্কে একটি গুরুত্বপূর্ণ বিষয় লক্ষণীয় হ'ল এটি সংক্ষিপ্ত শব্দ বা আরম্ভের সাথে কিছু সংখ্যার নাম রাউন্ড-ট্রিপ করতে সক্ষম হবে না যা সুইফট এপিআই নকশার নির্দেশিকা অনুসারে , সমানভাবে উপরের বা নিম্নতর (অবস্থানের উপর নির্ভর করে) হওয়া উচিত )।
উদাহরণস্বরূপ, নামের একটি সম্পত্তি 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
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!)
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!)
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)
}
এবং .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)
}
CodingKeysএনামের অধীনে কেস স্টেটমেন্টে ; আমি কী পরিবর্তিত হচ্ছি তার একটি কী তালিকাতে পারি?