এডি কোডার এডেকোডার ঠিক কী?


122

আমি একটি অনলাইন কোর্স থেকে আইওএস বিকাশ শিখছি এবং প্রতিবার আমি একটি কাস্টম ভিউ তৈরি করি (কাস্টম টেবিল ভিউ সেল, সংগ্রহ ভিউ সেল ইত্যাদি) প্রশিক্ষক সর্বদা এই আরম্ভকারীটি প্রয়োগ করে:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

আমাকে কেন সবসময় এই কল করতে হবে? এটার কাজ কি? আমি কি আরআইপি-র মধ্যে সম্পত্তি রাখতে পারি?


5
এই উত্তরটি আপনাকে সাহায্য করবে stackoverflow.com/questions/24036393/... আপনাকে ধন্যবাদ
Seungyoun য়ি

2
যদি আপনি প্রয়োগ করে এমন কোনও বস্তুকে সাবক্লাস করেন NSCodingতবে আপনাকে এই ইনিশিয়ালাইজারটি বাস্তবায়ন করতে হবে, যেহেতু এটি প্রয়োগকারী শ্রেণীর জন্য প্রয়োজনীয় NSCoding। আপনাকে অবশ্যই কমপক্ষে সুপারক্লাস ডিআইডি পদ্ধতিতে কল করতে হবে। যদি NSCoderআপনার শ্রেণীর জন্য
এনকোডযুক্ত

1
এছাড়াও, আমি আপনাকে অ্যাপলের অফিশিয়াল সুইফট বইতে অবজেক্ট ইনটালাইজেশন সম্পর্কে বিভাগটি পড়ার পরামর্শ দিচ্ছি।
নিকোলাস মিয়ারি

উত্তর:


121

আমি এই উত্তরটি বিপরীত দিক থেকে শুরু করব: আপনি যদি নিজের দর্শনটির অবস্থানটি ডিস্কে সংরক্ষণ করতে চান? এটি সিরিয়ালাইজেশন হিসাবে পরিচিত । বিপরীতটি হ্রাস করা - ডিস্ক থেকে বস্তুর স্থিতি পুনরুদ্ধার।

NSCodingপ্রোটোকল ধারাবাহিকভাবে এবং deserialize বস্তু দুটি পদ্ধতি সংজ্ঞায়িত করে:

encodeWithCoder(_ aCoder: NSCoder) {
    // Serialize your object here
}

init(coder aDecoder: NSCoder) {
    // Deserialize your object here
}

তাহলে এটি আপনার কাস্টম ক্লাসে কেন দরকার? উত্তরটি ইন্টারফেস বিল্ডার। আপনি যখন কোনও স্টোরিবোর্ডে কোনও বস্তু টেনে আনেন এবং কনফিগার করেন, ইন্টারফেস বিল্ডার সেই অবজেক্টের ডিস্কে অবস্থিত করে সিরিয়ালাইজ করে, তারপরে স্টোরিবোর্ডটি যখন স্ক্রিনে উপস্থিত হয় তখন এটিকে ডিসরিয়ালাইজ করে। এগুলি কীভাবে করা যায় সে সম্পর্কে আপনাকে ইন্টারফেস বিল্ডারকে বলতে হবে। খুব কমপক্ষে, আপনি যদি আপনার সাবক্লাসে কোনও নতুন বৈশিষ্ট্য যুক্ত না করেন তবে আপনি সুপারক্লাসকে কেবল আপনার জন্য প্যাকিং এবং আনপ্যাকিং করতে বলতে পারেন, তাই super.init(coder: aDecoder)কল। যদি আপনার সাবক্লাস আরও জটিল হয় তবে আপনাকে সাবক্লাসের জন্য নিজস্ব সিরিয়ালাইজেশন এবং ডিসরিয়ালাইজেশন কোড যুক্ত করতে হবে।

এটি ভিজ্যুয়াল স্টুডিওর পদ্ধতির বিপরীতে, যা কোডটি কোনও লুকানো ফাইলে লেখার সময় অবজেক্টটি তৈরির সময় তৈরি করতে হয়।


জাগ্রত থেকে সমস্ত কিছু romুকিয়ে রাখুন কেন init(coder aCoder : NSCoder)?
মধু 21

@ মধু - এক কথায়, "কখনও কখনও আপনি এটি করতে পারবেন না"। আপনি সাধারণত পারেন তবে সবসময় না।
ফ্যাটি

@ ফ্যাটি এটি খুব জটিল বা অযৌক্তিকভাবে না করার বিবরণ? না বুঝলে কি বুঝিয়ে বলবেন?
হানি

9
@ হানি আপনি যদি ইন্টারফেস বিল্ডারে আপনার অবজেক্টটি কনফিগার করতে চান তবে awakeFromNibকাজ করবে না। awakeFromNibএ প্রার্থনা করা হয় রান টাইম । ইন্টারফেস বিল্ডারে আপনি যা কিছু করেন তা ডিজাইনের সময়সময় চালানোর জন্য আপনি ডিজাইনের সময় যা করেছেন তা বহন করা encodeWithCoder(সংরক্ষণ করা) এবং init(coder:)(লোডিং)
কোড ভিন্ন ভিন্ন

3
@ হানি আপনি যদি নিজের কাস্টম ক্লাসটি কনফিগার করার জন্য ইন্টারফেস বিল্ডার ব্যবহার না করেন (যেমন কোড সহ প্রোগ্রামভিত্তিক করুন) তবে আপনি এটিতে awakeFromNibবা করতে পারেনinitWIthFrame
কোড ভিন্ন ভিন্ন

28

সেই ইনিশিয়ালাইজারটি বাস্তবায়নের প্রয়োজনীয়তা দুটি জিনিসের পরিণতি:

  1. Liskov প্রতিকল্পন নীতি । যদি এস টি টির একটি সাবক্লাস হয় (যেমন MyViewControllerএকটি সাবক্লাস ViewController), তবে এস অবজেক্টস (উদাহরণস্বরূপ MyViewController) অবশ্যই টি বিকল্পের (উদাহরণস্বরূপ ViewController) প্রত্যাশিত যেখানে প্রতিস্থাপন করতে সক্ষম হবেন ।

  2. প্রাথমিকভাবে সাবক্লাসে কোনও প্রারম্ভিককে সুস্পষ্টভাবে সংজ্ঞায়িত করা হলে সুইফটিতে প্রাথমিকভাবে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না। যদি একটি আরম্ভকারীকে সুস্পষ্টভাবে সরবরাহ করা হয় তবে অন্য সমস্ত অবশ্যই স্পষ্টভাবে সরবরাহ করা উচিত (যা কেবলমাত্র কল করতে পারে super.init(...))। যুক্তিযুক্ত জন্য এই প্রশ্ন দেখুন । এটি জাভাতে রয়েছে, তবে এখনও প্রযোজ্য।

পয়েন্ট 1 দ্বারা, সমস্ত কিছুই আসল ViewControllerকরতে পারে, MyViewControllerসাবক্লাসটি করতে সক্ষম হওয়া উচিত। যেমন একটি জিনিস একটি প্রদত্ত থেকে আরম্ভ করা সক্ষম হতে হবে NSCoder। 2 পয়েন্ট দ্বারা, আপনার MyViewControllerসাবক্লাস স্বয়ংক্রিয়ভাবে এই ক্ষমতা উত্তরাধিকারী না। সুতরাং, আপনাকে অবশ্যই ম্যানুয়ালি প্রাথমিকভাবে সরবরাহ করতে হবে যা এই প্রয়োজনীয়তা পূরণ করে। এই ক্ষেত্রে, আপনাকে কেবল সুপারক্লাসের কাছে প্রতিনিধি দেওয়া দরকার, এটি সাধারণত যা করতে পারে তা করার জন্য।


1
এটি নিখুঁতভাবে উপলব্ধি করে যে নির্মাণকারীরা উত্তরাধিকার সূত্রে প্রাপ্ত হয় না: আপনি যদি বেস শ্রেণীর (উত্তরাধিকারসূত্রে) আরম্ভকারী ব্যবহার করে উদ্ভূত শ্রেণীর কোনও উদাহরণ শুরু করেন তবে প্রাপ্ত উত্তরাধিকারী বৈশিষ্ট্যগুলি যে উত্পন্ন শ্রেণীর দ্বারা নতুনভাবে সংজ্ঞায়িত ("যুক্ত") হয়েছিল তা কখনই হবে না আরম্ভ করা।
নিকোলাস মিয়ারি

3
প্রকৃতপক্ষে, আর্টিকালাইজারগুলি সুইফটিতে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, আপনি যদি নিজের সাবক্লাসে নিজের কোনও আরম্ভকারী প্রয়োগকরণ সরবরাহ না করেন তবে। যদি আপনার নতুন সংজ্ঞায়িত অ-উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যগুলির ডিফল্ট মান থাকে তবে আপনি আপনার সাবক্লাসে কোনও প্রারম্ভিক লেখক না লিখে চলে যেতে পারেন এবং কেবলমাত্র আপনার সমস্ত সুপারক্লাসের আরম্ভকারীকে উত্তরাধিকার সূত্রে উত্তীর্ণ করতে পারেন। এখানে
TheBaj
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.