বিদ্যমান উত্তরগুলি কেবল convenienceগল্পের অর্ধেকটি বলে । গল্পের অন্যান্য অর্ধেক, অর্ধেকটি বিদ্যমান উত্তরগুলির কোনওটিই কভার করে না, ডেসমন্ড মন্তব্যগুলিতে পোস্ট করেছেন এমন প্রশ্নের উত্তর দেয়:
সুইফট আমাকে কেন convenienceআমার আরম্ভকারী সংঘের সামনে রাখার জন্য বাধ্য করবে কারণ আমাকে self.initএটির কল করা দরকার ? `
আমি এই উত্তরে এটিটিতে কিছুটা স্পর্শ করেছি , যার মধ্যে আমি সুইফ্টের প্রারম্ভকালীন নিয়মের কয়েকটি বিবরণে বিবরণ দিয়েছি , তবে সেখানে মূল দৃষ্টি নিবদ্ধ ছিল requiredশব্দটির দিকে। কিন্তু এই উত্তরটি এখনও এই প্রশ্নের সাথে এই উত্তরটির সাথে প্রাসঙ্গিক এমন কোনও কিছুকে সম্বোধন করছে। আমাদের বুঝতে হবে কীভাবে সুইফ্ট আরম্ভকারী উত্তরাধিকার কাজ করে।
যেহেতু সুইফট অবিচ্ছিন্ন ভেরিয়েবলগুলির জন্য অনুমতি দেয় না, আপনি যে শ্রেণী থেকে উত্তরাধিকারী হন সেখান থেকে সমস্ত (বা কোনও) প্রারম্ভিকর উত্তরাধিকারী হওয়ার নিশ্চয়তা নেই। যদি আমরা সাবক্লাস করে থাকি এবং আমাদের সাবক্লাসে কোনও অবিচ্ছিন্ন উদাহরণ ভেরিয়েবলগুলি যুক্ত করি, আমরা আরম্ভকারীদের উত্তরাধিকার সূচনা বন্ধ করে দিয়েছি। এবং যতক্ষণ না আমরা আমাদের নিজস্ব প্রারম্ভিকগুলি যোগ করি, সংকলকটি আমাদের দিকে চিত্কার করবে।
স্পষ্টতই, একটি অবিচ্ছিন্ন উদাহরণ ভেরিয়েবল এমন কোনও তাত্ক্ষণিক ভেরিয়েবল যা ডিফল্ট মান দেওয়া হয় না (বিকল্পগুলি এবং স্পষ্টতভাবে মোড়কযুক্ত বিকল্পগুলি স্বয়ংক্রিয়ভাবে একটি ডিফল্ট মান ধরে নেয় nil)।
সুতরাং এই ক্ষেত্রে:
class Foo {
var a: Int
}
aএকটি অবিবেচনা উদাহরণ পরিবর্তনশীল। আমরা aএকটি ডিফল্ট মান না দিলে এটি সংকলন করবে না :
class Foo {
var a: Int = 0
}
বা aএকটি ইনিশিয়াল পদ্ধতিতে সূচনা:
class Foo {
var a: Int
init(a: Int) {
self.a = a
}
}
এখন দেখা যাক আমরা সাবক্লাস করলে কী হয় Foo?
class Bar: Foo {
var b: Int
init(a: Int, b: Int) {
self.b = b
super.init(a: a)
}
}
রাইট? আমরা একটি ভেরিয়েবল যুক্ত করেছি, এবং আমরা একটি মান সেট করতে একটি প্রাথমিককরণ যুক্ত করেছি bযাতে এটি সংকলিত হয়। আপনি কোন ভাষা থেকে আসছেন তার উপর নির্ভর করে আপনি আশা করতে পারেন যে Barউত্তরাধিকার Fooসূচনার উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে init(a: Int)। তবে তা হয় না। এবং এটা কিভাবে পারে? কেমন করে Foo'র init(a: Int)জানেন কিভাবে একটি মান নির্ধারণ করতে bযে পরিবর্তনশীল Barযোগ? এটা হয় না। সুতরাং আমরা Barকোনও ইনিশিয়ালাইজার দিয়ে কোনও সূচনা দিতে পারি না যা আমাদের সমস্ত মানকে আরম্ভ করতে পারে না।
এর কোনটির সাথে কী সম্পর্ক আছে convenience?
আচ্ছা, আসুন আরম্ভের উত্তরাধিকারের নিয়মগুলি দেখুন :
বিধি 1
যদি আপনার সাবক্লাস কোনও মনোনীত প্রারম্ভিক সংজ্ঞা দেয় না, এটি স্বয়ংক্রিয়ভাবে তার সমস্ত সুপারক্লাস মনোনীত প্রারম্ভিকদের উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
বিধি 2
যদি আপনার সাবক্লাস তার সুপারক্লাস নির্ধারিত প্রাথমিক সকলের একটি বাস্তবায়ন সরবরাহ করে — হয় নিয়ম 1 অনুযায়ী উত্তরাধিকার সূত্রে বা তার সংজ্ঞা হিসাবে অংশ হিসাবে একটি কাস্টম বাস্তবায়ন সরবরাহ করে — তবে এটি স্বয়ংক্রিয়ভাবে সমস্ত সুপারক্লাস সুবিধার্থে প্রাথমিকভাবে উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
বিধি 2 নোটিশে, সুবিধামত প্রাথমিকদের উল্লেখ রয়েছে।
তাই কি convenienceশব্দ নেই করি আমাদের কাছে যা initializers ইঙ্গিত উত্তরাধিকারসূত্রে যাবে উপশ্রেণী যে ডিফল্ট মান ছাড়া অ্যাড উদাহরণস্বরূপ ভেরিয়েবল।
এই উদাহরণ Baseবর্গ গ্রহণ করা যাক :
class Base {
let a: Int
let b: Int
init(a: Int, b: Int) {
self.a = a
self.b = b
}
convenience init() {
self.init(a: 0, b: 0)
}
convenience init(a: Int) {
self.init(a: a, b: 0)
}
convenience init(b: Int) {
self.init(a: 0, b: b)
}
}
আমাদের তিনটি আছে লক্ষ্য করুন convenience এখানে সূচনা রয়েছে। এর অর্থ আমাদের উত্তরাধিকারসূত্রে প্রাপ্ত তিনটি সূচনা রয়েছে। এবং আমাদের একটি মনোনীত ইনিশিয়ালাইজার রয়েছে (একটি মনোনীত প্রারম্ভকালীন কেবল কোনও প্রাথমিক সূচক যা কোনও সুবিধাপূর্ণ আরম্ভকারী নয়)।
আমরা বেস শ্রেণীর উদাহরণগুলি চারটি বিভিন্ন উপায়ে ইনস্ট্যান্ট করতে পারি:

সুতরাং, একটি সাবক্লাস তৈরি করা যাক।
class NonInheritor: Base {
let c: Int
init(a: Int, b: Int, c: Int) {
self.c = c
super.init(a: a, b: b)
}
}
আমরা উত্তরাধিকার সূত্রে পেয়েছি Base। আমরা আমাদের নিজস্ব ইনস্টল ভেরিয়েবল যুক্ত করেছি এবং আমরা এটিকে একটি ডিফল্ট মান দিতে পারি নি, তাই আমাদের অবশ্যই নিজের নিজস্ব আরম্ভকারীগুলি যুক্ত করতে হবে। আমরা এক যোগ init(a: Int, b: Int, c: Int), কিন্তু এটা মেলে না স্বাক্ষর Baseবর্গ সূচনাকারী মনোনীত আছে: init(a: Int, b: Int)। এর অর্থ, আমরা কোনও প্রারম্ভিককে উত্তরাধিকার সূত্রে নিচ্ছি না Base:

সুতরাং, যদি আমরা উত্তরাধিকার সূত্রে প্রাপ্ত হই তবে কী হবে Baseতবে আমরা এগিয়ে গিয়ে একটি ইনিশিয়ালাইজার প্রয়োগ করেছি যা থেকে মনোনীত প্রাথমিকের সাথে মিল রয়েছে Base?
class Inheritor: Base {
let c: Int
init(a: Int, b: Int, c: Int) {
self.c = c
super.init(a: a, b: b)
}
convenience override init(a: Int, b: Int) {
self.init(a: a, b: b, c: 0)
}
}
এখন, আমরা এই ক্লাসে সরাসরি দুটি বাস্তবায়নকারীকে প্রয়োগ করেছি, কারণ আমরা একটি প্রাথমিক শিক্ষাকারীর সাথে ম্যাচিং Baseক্লাসের মনোনীত ইনিশিয়ালাইজার প্রয়োগ করেছি , আমরা Baseক্লাসের সমস্ত আরম্ভকারীদের উত্তরাধিকারী হতে পারি convenience:

ম্যাচের স্বাক্ষরের সাথে ইনিশিয়ালাইজার হিসাবে চিহ্নিত করা convenienceহয়েছে তা এখানে কোনও পার্থক্য করে না। এটির অর্থ Inheritorকেবলমাত্র একটি মনোনীত আরম্ভকারী রয়েছে। সুতরাং আমরা যদি উত্তরাধিকার সূত্রে পাই তবে আমাদের Inheritorকেবলমাত্র সেই একজন মনোনীত আরম্ভকারী প্রয়োগ করতে হবে এবং তারপরে আমরা আমাদের Inheritorসুবিধামত প্রাথমিক সূচকটি পেয়ে যাব , যার ফলস্বরূপ আমরা এর সমস্ত Baseমনোনীত আরম্ভকারীকে প্রয়োগ করেছি এবং এর convenienceআরম্ভকারীদের উত্তরাধিকারী হতে পারি ।