json - কীভাবে বৈশিষ্ট্যগুলি সুইফট 4 এর কোডেবল থেকে বাদ দেওয়া যায়




swift codable (3)

আমি ইমেজ (বা কোডড থেকে বাদ দিতে হবে এমন কোনও সম্পত্তি) সম্পত্তি স্থাপনের জন্য অ্যাসোসিয়েটেডবজেক্টের সাথে প্রোটোকল এবং এর সম্প্রসারণ ব্যবহার করেছি।

এটির সাথে আমাদের নিজস্ব এনকোডার এবং ডিকোডার প্রয়োগ করতে হবে না

সরলতার জন্য প্রাসঙ্গিক কোড রেখে কোডটি এখানে:

 protocol SCAttachmentModelProtocol{ var image:UIImage? {get set} var anotherProperty:Int {get set} } extension SCAttachmentModelProtocol where Self: SCAttachmentUploadRequestModel{ var image:UIImage? { set{ //Use associated object property to set it } get{ //Use associated object property to get it } } } class SCAttachmentUploadRequestModel : SCAttachmentModelProtocol, Codable{ var anotherProperty:Int } 

এখন, যখনই আমরা চিত্রের বৈশিষ্ট্যটি অ্যাক্সেস করতে চাই আমরা প্রোটোকলের (এসসিএটিচমেন্টমেন্ট মডেলপ্রোটোকল) নিশ্চিতকরণকারী অবজেক্টটিতে ব্যবহার করতে পারি

সুইফ 4 এর নতুন Encodable / Decodable প্রোটোকলগুলি Decodable (ডি) সিরিয়ালিকেশনটিকে বেশ মনোরম করে। তবে কোন বৈশিষ্ট্যগুলি এনকোড করা উচিত এবং কোনটি ডিকোড করা উচিত তার পক্ষে সূক্ষ্ম-দানাযুক্ত নিয়ন্ত্রণের কোনও উপায় আমি এখনও খুঁজে পাইনি।

আমি লক্ষ্য করেছি যে CodingKeys থেকে সম্পত্তি বাদ দিয়ে সম্পত্তিটি পুরোপুরি প্রক্রিয়া থেকে বাদ দেওয়া হয়, তবে কী আরও সূক্ষ্ম নিয়ন্ত্রণের উপায় আছে?


এনকোড / ডিকোড করার কীগুলির তালিকা CodingKeys নামে পরিচিত একটি ধরণের মাধ্যমে নিয়ন্ত্রিত হয়। সংকলকটি আপনার জন্য এটি সংশ্লেষিত করতে পারে তবে সর্বদা এটি ওভাররাইড করতে পারে।

ধরা যাক আপনি সম্পত্তিটির nickname এনকোড / ডিকোড করতে চান না:

struct Person: Codable {
    var firstName: String
    var lastName: String
    var nickname: String?

    private enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
    }
}

এটি এনকোডিং এবং ডিকোডিংয়ের nickname বাদ দেবে।

আপনি যদি এটি অসম্পূর্ণ হতে চান (যেমন এনকোড তবে ডিকোড বা তদ্বিপরীত নয়), আপনার নিজের encode(with encoder: ) এবং init(from decoder: ) encode(with encoder: ) এর নিজস্ব প্রয়োগ সরবরাহ করতে হবে:

struct Person: Codable {
    var firstName: String
    var lastName: String

    // Since fullName is a computed property, it's excluded by default
    var fullName: String {
        return firstName + " " + lastName
    }

    private enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
        case fullName
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        firstName = try container.decode(String.self, forKey: .firstName)
        lastName = try container.decode(String.self, forKey: .lastName)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(firstName, forKey: .firstName)
        try container.encode(lastName, forKey: .lastName)
        try container.encode(fullName, forKey: .fullName)
    }
}

যদিও এটি করা যায় এটি শেষ পর্যন্ত খুব অদ্বিতীয় এবং এমনকি আনজেসনি হয়ে শেষ হয় । আমি মনে করি আপনি যেখান থেকে আসছেন আমি তা দেখতে পেয়েছি, # #id ধারণাটি এইচটিএমএল-তে প্রচলিত রয়েছে, তবে এটি খুব কমই #id এর বিশ্বে স্থানান্তরিত হয় যা আমি একটি ভাল জিনিস (টিএম) বিবেচনা করি।

কিছু Codable স্ট্রাক্ট আপনার JSON ফাইলকে ঠিক জরিমানা করতে সক্ষম হবে যদি আপনি এটি পুনরাবৃত্ত হ্যাশগুলি ব্যবহার করে পুনর্গঠন করেন, অর্থাত যদি আপনার recipe এমন ingredients একটি অ্যারে থাকে যা ঘুরেফিরে (এক বা একাধিক) ingredient_info । এইভাবে পার্সারটি আপনাকে প্রথম স্থানে আপনার নেটওয়ার্ককে সেলাই করতে সহায়তা করবে এবং আপনার যদি সত্যিই প্রয়োজন হয় তবে আপনার কেবল কাঠামোর সাধারণ ট্র্যাভারসালের মাধ্যমে কিছু ব্যাকলিঙ্ক সরবরাহ করতে হবে । যেহেতু এটির জন্য আপনার JSON এবং আপনার ডেটা কাঠামোর পুরোপুরি পুনর্নির্মাণের প্রয়োজন আমি এটি সম্পর্কে আপনার চিন্তাভাবনা করার জন্য কেবল ধারণাটি স্কেচ করি। যদি আপনি এটি গ্রহণযোগ্য বলে মনে করেন তবে দয়া করে আমাকে মন্তব্যগুলিতে বলুন তবে আমি এটি আরও বিশদভাবে জানাতে পারি, তবে পরিস্থিতিগুলির উপর নির্ভর করে আপনি তাদের কোনও একটি পরিবর্তন করার স্বাধীনতা থাকতে পারবেন না।





codable