से डॉक्स
सुरक्षा जाँच १
एक निर्दिष्ट इनिशियलाइज़र को यह सुनिश्चित करना होगा कि सुपरक्लास इनिशियलाइज़र के सामने आने से पहले उसके वर्ग द्वारा शुरू की गई सभी संपत्तियों को इनिशियलाइज़ किया जाए।
हमें इस तरह से सुरक्षा जांच की आवश्यकता क्यों है?
इसका उत्तर देने के लिए हालांकि प्रारंभिक प्रक्रिया में तेजी आती है।
दो-चरण की शुरूआत
स्विफ्ट में क्लास इनिशियलाइज़ेशन एक दो-चरण की प्रक्रिया है। पहले चरण में, प्रत्येक संग्रहीत संपत्ति को उस वर्ग द्वारा प्रारंभिक मूल्य सौंपा जाता है जिसने इसे पेश किया था। एक बार प्रत्येक संग्रहीत संपत्ति के लिए प्रारंभिक स्थिति निर्धारित हो जाने के बाद, दूसरा चरण शुरू होता है, और प्रत्येक वर्ग को अपने संग्रहीत गुणों को आगे बढ़ाने का अवसर दिया जाता है, इससे पहले कि नई आवृत्ति उपयोग के लिए तैयार मानी जाए।
दो-चरण आरंभीकरण प्रक्रिया का उपयोग आरंभीकरण को सुरक्षित बनाता है, जबकि अभी भी एक वर्ग पदानुक्रम में प्रत्येक वर्ग को पूर्ण लचीलापन देता है। दो-चरण का प्रारंभ संपत्ति के मूल्यों को प्रारंभिक होने से पहले एक्सेस करने से रोकता है, और संपत्ति के मान को अप्रत्याशित रूप से किसी अन्य इनिशियलाइज़र द्वारा भिन्न मान पर सेट होने से रोकता है।
इसलिए, यह सुनिश्चित करने के लिए कि दो चरण आरंभीकरण प्रक्रिया ऊपर बताई गई है, चार सुरक्षा जांच हैं, उनमें से एक है,
सुरक्षा जाँच १
एक निर्दिष्ट इनिशियलाइज़र को यह सुनिश्चित करना होगा कि सुपरक्लास इनिशियलाइज़र के सामने आने से पहले उसके वर्ग द्वारा शुरू की गई सभी संपत्तियों को इनिशियलाइज़ किया जाए।
अब, दो चरण के आरंभीकरण आदेश के बारे में कभी बात नहीं करता है, लेकिन यह सुरक्षा जांच, super.initसभी गुणों के आरंभ के बाद, आदेश दिए जाने का परिचय देता है।
सेफ्टी चेक 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एक गैर वैकल्पिक संपत्ति अभी भी initialised नहीं किया गया है। और इसकी अनुमति नहीं है क्योंकि दो-चरण आरंभीकरण संपत्ति के मूल्यों को आरंभिक होने से पहले एक्सेस करने से रोकता है
इसलिए सुनिश्चित करें कि दो चरण की super.initशुरुआत को परिभाषित किया गया है, कॉलिंग का एक विशिष्ट क्रम होना चाहिए , और वह यह है कि selfकक्षा द्वारा शुरू की गई सभी संपत्तियों को शुरू करने के बाद , इस प्रकार हमें एक सुरक्षा जांच की आवश्यकता है 1