ডক্স থেকে
সুরক্ষা চেক 1
একজন মনোনীত ইনিশিয়ালাইজারকে অবশ্যই নিশ্চিত করতে হবে যে এটির শ্রেণীর দ্বারা প্রবর্তিত সমস্ত সম্পত্তি একটি সুপারক্লাস ইনিশিয়ালাইজারের কাছে অর্পণ করার আগেই এটির সূচনা হয়েছিল।
আমাদের কেন এই জাতীয় সুরক্ষা চেক দরকার?
এর উত্তর দিতে দ্রুত চলতে শুরু করা যাক initial
দ্বি-পর্বের সূচনা
সুইফটে ক্লাস ইনিশিয়ালাইজেশন একটি দ্বি-ফেজ প্রক্রিয়া। প্রথম পর্যায়ে, প্রতিটি সঞ্চিত সম্পত্তি শ্রেণি দ্বারা এটির সূচনা করে একটি প্রাথমিক মান নির্ধারিত হয়। একবার প্রতিটি সঞ্চিত সম্পত্তির প্রাথমিক অবস্থা নির্ধারণ করা হলে, দ্বিতীয় পর্ব শুরু হয় এবং নতুন শ্রেণীর ব্যবহারের জন্য প্রস্তুত হিসাবে বিবেচনা করার আগে প্রতিটি শ্রেণিকে তার সঞ্চিত বৈশিষ্ট্যগুলি আরও কাস্টমাইজ করার সুযোগ দেওয়া হয়।
দ্বি-পর্বের সূচনা প্রক্রিয়াটির ব্যবহার সূচনাটি নিরাপদ করে তোলে, তবুও প্রতিটি শ্রেণীর শ্রেণিবিন্যাসে প্রতিটি শ্রেণিকে সম্পূর্ণ নমনীয়তা দেয়। দ্বি-পর্যায়ে সূচনা সম্পত্তি মানগুলি আরম্ভ করার আগে অ্যাক্সেস করা থেকে বাধা দেয় এবং সম্পত্তি মানগুলি অপ্রত্যাশিতভাবে অন্য আরম্ভকারী দ্বারা পৃথক মান সেট করা থেকে বাধা দেয়।
সুতরাং, উপরোক্ত সংজ্ঞায়িত হিসাবে দুটি পদক্ষেপের সূচনা প্রক্রিয়াটি সম্পন্ন হয়েছে তা নিশ্চিত করার জন্য, এখানে চারটি সুরক্ষা চেক রয়েছে, যার মধ্যে একটি হ'ল,
সুরক্ষা চেক 1
একজন মনোনীত ইনিশিয়ালাইজারকে অবশ্যই নিশ্চিত করতে হবে যে এটির শ্রেণীর দ্বারা প্রবর্তিত সমস্ত সম্পত্তি একটি সুপারক্লাস ইনিশিয়ালাইজারের কাছে অর্পণ করার আগেই এটির সূচনা হয়েছিল।
এখন, দুই ধাপের সূচনাটি কখনই আদেশের বিষয়ে কথা বলে না, তবে এই সুরক্ষা চেকটি super.initসমস্ত সম্পত্তি শুরু করার পরে অর্ডার দেওয়ার জন্য পরিচয় করিয়ে দেয়।
সুরক্ষা চেক 1 এটিকে অপ্রাসঙ্গিক বলে মনে হতে পারে,
দ্বি-পর্বের সূচনা সম্পত্তি মানগুলি আরম্ভ করার আগেই তা অ্যাক্সেস হওয়া থেকে বাধা দেয় এই সুরক্ষা চেক 1 ছাড়াই সন্তুষ্ট হতে পারে।
এই নমুনা মত
class Shape {
var name: String
var sides : Int
init(sides:Int, named: String) {
self.sides = sides
self.name = named
}
}
class Triangle: Shape {
var hypotenuse: Int
init(hypotenuse:Int) {
super.init(sides: 3, named: "Triangle")
self.hypotenuse = hypotenuse
}
}
Triangle.initব্যবহার শুরু করার আগে প্রতিটি সম্পত্তি শুরু করে দিয়েছে। সুতরাং সুরক্ষা চেক 1 অপ্রাসঙ্গিক বলে মনে হচ্ছে,
তবে তারপরে আর এক দৃশ্য হতে পারে, কিছুটা জটিল,
class Shape {
var name: String
var sides : Int
init(sides:Int, named: String) {
self.sides = sides
self.name = named
printShapeDescription()
}
func printShapeDescription() {
print("Shape Name :\(self.name)")
print("Sides :\(self.sides)")
}
}
class Triangle: Shape {
var hypotenuse: Int
init(hypotenuse:Int) {
self.hypotenuse = hypotenuse
super.init(sides: 3, named: "Triangle")
}
override func printShapeDescription() {
super.printShapeDescription()
print("Hypotenuse :\(self.hypotenuse)")
}
}
let triangle = Triangle(hypotenuse: 12)
আউটপুট:
Shape Name :Triangle
Sides :3
Hypotenuse :12
এখানে আমরা যদি super.initসেটিংস স্থাপনের আগে কল করেছিলাম hypotenuse, super.initকলটি তখন কল করত printShapeDescription()এবং যেহেতু ওভাররাইড করা হয়েছে তা এটি প্রথমে ট্রায়াঙ্গলের শ্রেণি প্রয়োগের ফ্যালব্যাক হয়ে যাবে printShapeDescription()। printShapeDescription()ট্রায়াঙ্গেল বর্গ অ্যাক্সেস hypotenuseএকটি অ ঐচ্ছিক সম্পত্তি এখনও ইনিশিয়ালাইজ করা হয় নি যে। এবং এটি অনুমোদিত নয় কারণ দ্বি-ফেজ সূচনা সম্পত্তি সম্পত্তিগুলি আরম্ভ করার আগে তাদের অ্যাক্সেস করা থেকে বাধা দেয়
সুতরাং নিশ্চিত করুন যে দ্বি ফেজের সূচনাটি সংজ্ঞায়িত হিসাবে সম্পন্ন হয়েছে, সেখানে কল করার একটি নির্দিষ্ট ক্রম হওয়া দরকার super.init, এবং তা হচ্ছে selfশ্রেণীর দ্বারা প্রবর্তিত সমস্ত সম্পত্তি শুরু করার পরে , আমাদের সুরক্ষা চেক 1 দরকার