تعارف ہیلو! میرا نام کیرل فامین ہے، اور میں ایک iOS ڈویلپر ہوں۔ آج، میں سوئفٹ میں ابتداء کے طور پر اس طرح کے ایک سادہ موضوع کا اچھی طرح سے جائزہ لینا چاہتا ہوں۔ اس کی ظاہری سادگی کے باوجود، بعض اوقات اس موضوع کی تفہیم کی کمی مایوس کن غلطیوں کا باعث بنتی ہے جسے کوئی شخص تفصیلات میں جانے کے بغیر جلدی ٹھیک کرنا چاہتا ہے۔ مکمل اس آرٹیکل میں، ہم ابتدا کرنے والوں سے متعلق ہر چیز کا احاطہ کریں گے، بشمول: کسٹم کی وضاحت کرتے ہوئے ڈھانچے کے ممبر وائز انیشیلائزر کو کیسے برقرار رکھا جائے۔ کلاسوں میں ابتدائی لکھنا ہمیشہ کیوں ضروری نہیں ہوتا ہے۔ کیوں کو کال کرنے کی ہمیشہ ایک مقررہ ابتدائی میں ضرورت نہیں ہوتی ہے۔ super.init کال کرنے سے پہلے ذیلی طبقے کے تمام فیلڈز کو کیوں پاپولیشن کرنا ضروری ہے۔ super.init ذیلی طبقات میں کم سے کم اوور رائیڈ کے ساتھ تمام پیرنٹ انیشیلائزرز تک کیسے رسائی حاصل کی جائے۔ جب بالکل ایک ابتداء کی ضرورت ہوتی ہے۔ required کو ہمیشہ پیرامیٹرز کے بغیر کیوں کہا جاتا ہے، لیکن اور اوور رائیڈ کیا جاتا ہے UIView.init() init(frame:) init(coder:) ...اور مزید لیکن آئیے اسے قدم بہ قدم چلتے ہیں۔ مندرجات کا جدول بنیادی باتیں ڈھانچے ممبر کے مطابق ابتدا کرنے والا اختیاری بمقابلہ var let ممبر وائز انیشیلائزر کو برقرار رکھنا کلاسز نامزد ابتدائی کنندہ سہولت شروع کرنے والا سپرکلاس کی سہولت شروع کرنے والا برقرار رکھنا اوور رائیڈز کی تعداد کو کم سے کم کرنا کمپائلر کی مدد ابتدائی کنندہ: generics، protocols، , required Self() final بغیر پیرامیٹرز کے UIView() معزز تذکرہ ناکام init اینومس خلاصہ متعلقہ لنکس بنیادی باتیں ایپل کی گائیڈ (جو ویسے بھی، ابتدا کرنے والوں کے لیے حیرت انگیز طور پر تفصیلی ہے) کہتی ہے: دی سوئفٹ پروگرامنگ لینگویج (6) ایک کلاس، ڈھانچے، یا استعمال کے لیے شمار کی مثال تیار کرنے کا عمل ہے۔ اس عمل میں اس مثال پر ہر ذخیرہ شدہ پراپرٹی کے لیے ایک ابتدائی قدر کا تعین کرنا اور کسی دوسرے سیٹ اپ یا ابتداء کو انجام دینا شامل ہے جو نئی مثال کے استعمال کے لیے تیار ہونے سے پہلے درکار ہے۔ ابتداء آپ ابتداء کے اس عمل کو وضاحت کرتے ہوئے لاگو کرتے ہیں، جو کہ خاص طریقوں کی طرح ہیں جنہیں کسی خاص قسم کی نئی مثال بنانے کے لیے کہا جا سکتا ہے۔ Objective-C انیشیلائزرز کے برعکس، سوئفٹ انیشیلائزرز کوئی قدر واپس نہیں کرتے ہیں۔ ان کا بنیادی کردار یہ یقینی بنانا ہے کہ کسی قسم کی نئی مثالیں پہلی بار استعمال ہونے سے پہلے صحیح طریقے سے شروع کی جائیں۔ شروع کرنے والے کی ٹھیک ہے، مجھے لگتا ہے کہ مجھے یہاں کچھ بھی شامل کرنے کی ضرورت نہیں ہے۔ ڈھانچے آئیے سٹرکچر انیشیلائزرز پر بحث کرتے ہوئے شروع کریں۔ یہ بہت آسان ہے کیونکہ کوئی وراثت نہیں ہے، لیکن پھر بھی کچھ اصول ہیں جن کے بارے میں آپ کو جاننا چاہیے۔ ممبر کے مطابق ابتدا کرنے والا آئیے ایک سادہ ساخت لکھتے ہیں: struct BankAccount { let amount: Double let isBlocked: Bool } let bankAccount = BankAccount(amount: 735, isBlocked: Bool) نوٹ کریں کہ ہم واضح طور پر ابتدائیہ کا اعلان کیے بغیر ساخت کو شروع کرنے کے قابل تھے۔ ایسا اس لیے ہوتا ہے کیونکہ ڈھانچے کو کمپائلر کے ذریعے تیار کردہ ملتا ہے۔ یہ کام کرتا ہے۔ ممبر وار انیشیلائزر صرف ڈھانچے کے لیے منتخب کرکے، آپ دیکھ سکتے ہیں کہ یہ کیسا لگتا ہے: Refactor → Generate memberwise ابتداء کو init(amount: Double, isBlocked: Bool) { self.amount = amount self.isBlocked = isBlocked } دستخط سے، یہ دیکھنا آسان ہے کہ تمام پیرامیٹرز کے لیے اقدار فراہم کرنے میں ناکامی کے نتیجے میں تالیف کی غلطی ہو جائے گی: let bankAccount = BankAccount(amount: 735) // ❌ Missing argument for parameter 'isBlocked' in call تاہم، اگر آپ مطلوبہ دلائل کی تعداد کو کم کرنا چاہتے ہیں، تو آپ اپنی مرضی کے مطابق ابتدا کرنے والے کی وضاحت کر سکتے ہیں: init(amount: Double, isBlocked: Bool = false) { self.amount = amount isBlocked = isBlocked } let bankAccount = BankAccount(amount: 735) // ✅ نوٹ کریں کہ اگر آباد نہیں کیا گیا ہے، تو اس کے نتیجے میں تالیف کی خرابی ہو گی کیونکہ ۔ isBlocked تمام ڈھانچے کی خصوصیات کو انیشیلائزر میں آباد کرنا ضروری ہے بمقابلہ اختیاری، var let واحد صورت جہاں کسی فیلڈ کو آباد کرنے کی ضرورت نہیں ہے جب یہ ( ) ( ) ہو۔ ایسی صورتوں میں، فیلڈ ڈیفالٹ ہو جائے گا : واضح طور پر اختیاری ? متغیر var nil struct BankAccount { let amount: Double var isBlocked: Bool? init(amount: Double) { self.amount = amount } } let bankAccount = BankAccount(amount: 735) // ✅ تاہم، اگر ہم اس معاملے میں ممبر وائز انیشیلائزر کو استعمال کرنے کی کوشش کرتے ہیں، تو ہمیں ایک تالیف کی خرابی ملے گی: let bankAccount = BankAccount( amount: 735, isBlocked: false ) // ❌ Extra argument 'isBlocked' in call ممبر وائز انیشیلائزر کو برقرار رکھنا ایسا اس لیے ہوتا ہے کہ کسٹم انیشیلائزر کا اعلان کرنے سے ممبر وائز انیشیلائزر ہٹ جاتا ہے۔ واضح طور پر اس کی وضاحت کرنا اب بھی ممکن ہے، لیکن یہ خود بخود دستیاب نہیں ہوگا۔ تاہم، ممبر وائز انیشیلائزر کو برقرار رکھنے کے لیے ایک چھوٹی سی چال ہے: میں کسٹم انیشیلائزر کا اعلان کریں۔ extension struct BankAccount { let amount: Double var isBlocked: Bool? } extension BankAccount { init(amount: Double) { self.amount = amount } } let barclaysBankAccount = BankAccount(amount: 735) // ✅ let revolutBankAccount = BankAccount(amount: 812, isBlocked: false) // ✅ print(barclaysBankAccount.isBlocked) // nil print(barclaysBankAccount.isBlocked) // false ڈھانچے کا خلاصہ تمام فیلڈز کو ایک انیشیلائزر میں آباد کیا جانا چاہیے۔ اختیاری var فیلڈز ڈیفالٹ سے nil سٹرکچرز کو ممبر کے مطابق ایک مفت انیشیلائزر ملتا ہے۔ ممبر وائز انیشیلائزر غائب ہو جاتا ہے اگر حسب ضرورت انیشیلائزر کا اعلان کیا جاتا ہے۔ ڈھانچے کے ممبر وائز انیشیلائزر کو برقرار رکھنے کے لیے، extension میں اپنی مرضی کے مطابق کی وضاحت کریں۔ کلاسز نامزد ابتدائی کنندہ کلاس کے لیے پرائمری انیشیلائزر ہے۔ یہ دو مقاصد کو پورا کرتا ہے: نامزد انیشیلائزر اس بات کو یقینی بناتا ہے کہ تمام فیلڈز آباد ہیں۔ اگر کلاس وراثت میں ملی ہے، تو اسے سپر کلاس انیشیلائزر کہتے ہیں۔ class Animal { var name: String init(name: String) { self.name = name } } class Dog: Animal { var breed: String var name: String init(breed: String, name: String) { self.breed = breed super.init(name: name) } } کال کرنے ۔ اس کی وجہ یہ ہے کہ سپر کلاس انیشیلائزر ذیلی طبقے کے ذریعے اوور رائیڈ کردہ طریقوں کو کال کر سکتا ہے، جو غیر آباد ذیلی طبقے کی خصوصیات تک رسائی حاصل کر سکتے ہیں۔ super.init سے پہلے تمام فیلڈز کو آباد کرنا ضروری ہے class Animal { var age: Int init(age: Int) { self.age = age getInfo() } func getInfo() { print("Age: ", age) } } class Dog: Animal { var breed: String init(breed: String, age: Int) { self.breed = breed // imagine we haven't done this super.init(age: age) } override func getInfo() { print("Age: ", age, ", breed: ", breed) } } اس طرح، اگر ہم نے سیٹ نہ کیا ہوتا تو ہمیں رن ٹائم غلطی کا سامنا کرنا پڑتا کیونکہ انیشیلائزر نے کلاس سے اوور رائیڈڈ طریقہ کو کال کیا ہوتا۔ یہ طریقہ جائیداد تک رسائی حاصل کرنے کی کوشش کرتا ہے، جو ابھی تک آباد نہیں ہوگی۔ self.breed = breed Animal Dog getInfo() breed ڈھانچے کے برعکس، کلاسوں کو رکنیت کے لحاظ سے ایک مضمر ابتدائیہ موصول نہیں ہوتا ہے۔ اگر غیر شروع شدہ خصوصیات ہیں تو، ایک تالیف کی خرابی واقع ہوتی ہے: class Animal { // ❌ Class 'Animal' has no initializers var age: Int } class Animal { // ✅ var age: Int = 0 } class Animal { // ✅ var age: Int? } class Animal { } // ✅ سہولت شروع کرنے والا کلاسوں میں بھی ہو سکتا ہے۔ نامزد انیشیلائزرز کے برعکس، وہ شروع سے کوئی چیز نہیں بناتے ہیں بلکہ دوسرے انیشیلائزرز کی منطق کو دوبارہ استعمال کر کے ابتدا کے عمل کو آسان بناتے ہیں۔ سہولت شروع کرنے والا class Rectangle { var width: Double var height: Double init(width: Double, height: Double) { self.width = width self.height = height } convenience init(side: Double) { self.init(width: side, height: side) // uses a designated initializer of self } } سہولت شروع کرنے والے یا تو نامزد انیشیلائزرز یا دیگر سہولت انیشیلائزرز کو کال کر سکتے ہیں۔ بالآخر، ایک نامزد ابتدائی کنندہ کو ہمیشہ بلایا جائے گا۔ سہولت شروع کرنے والے ہمیشہ افقی (self.init) جاتے ہیں، اور نامزد ابتدائی عمودی (super.init) جاتے ہیں۔ سپرکلاس کی سہولت کی ابتداء کو برقرار رکھنا جیسے ہی کوئی ذیلی طبقہ نئی خصوصیات کا اعلان کرتا ہے، یہ سپرکلاس کے تمام سہولتوں کے آغاز تک رسائی کھو دیتا ہے۔ class Animal { var age: Int var name: String init(age: Int, name: String) { self.age = age self.name = name } convenience init(age: Int) { self.init(age: age, name: "Default") } convenience init(name: String) { self.init(age: 0, name: name) } } class Dog: Animal { var breed: String init(age: Int, name: String, breed: String) { self.breed = breed super.init(age: age, name: name) } } let dog = Dog(age: 3) // ❌ Missing arguments for parameters 'breed', 'name' in call اسے اوور رائیڈ کر کے ٹھیک کیا جا سکتا ہے۔ سپر کلاس کے تمام نامزد ابتدائیوں کو class Dog: Animal { // ... override init(age: Int, name: String) { self.breed = "Mixed" super.init(age: age, name: name) } } let dog = Dog(age: 3) // ✅ یہ دیکھنا آسان ہے کہ، اس طرح، اگلے ذیلی طبقے میں ایک سہولت انیشیئلائزر استعمال کرنے کے لیے، آپ کو انیشیلائزرز کو اوور رائڈ کرنے کی ضرورت ہے۔ دو class GuideDog: Dog { var isTrained: Bool override init(age: Int, name: String) { self.isTrained = false super.init(age: age, name: name) } override init(age: Int, name: String, breed: String) { self.isTrained = false super.init(age: age, name: name, breed: breed) } init(age: Int, name: String, breed: String, isTrained: Bool) { self.isTrained = isTrained super.init(age: age, name: name, breed: breed) } } let dog = GuideDog(age: 3) // ✅ اوور رائیڈز کی تعداد کو کم سے کم کرنا تاہم، استعمال کر کے اس سے بچا جا سکتا ہے۔ سہولت اوور رائیڈ انیشیلائزر کا class Dog: Animal { var breed: String convenience override init(age: Int, name: String) { self.init(age: age, name: name, breed: "Mixed") // self, not super } init(age: Int, name: String, breed: String) { self.breed = breed super.init(age: age, name: name) } } class GuideDog: Dog { var isTrained: Bool // override init(age: Int, name: String) { // self.isTrained = false // // super.init(age: age, name: name, breed: "Mixed") // } convenience override init(age: Int, name: String, breed: String) { self.init(age: age, name: name, breed: breed, isTrained: false) // self, not super } init(age: Int, name: String, breed: String, isTrained: Bool) { self.isTrained = isTrained super.init(age: age, name: name, breed: breed) } } let dog = GuideDog(age: 3) // ✅ اب ہمارے پاس ہر ذیلی طبقے میں صرف 2 واضح طور پر مخصوص ابتدائیہ ہیں۔ کی بجائے نامزد init کہتے ہیں۔ غور کریں کہ کس طرح سہولت کو اوور رائیڈ انیشیلائزر super.init self اس چال کی وضاحت کے باب 5 میں Tjeerd کی طرف سے 't Veen میں کی گئی ہے، ایک کتاب جس کی میں انتہائی سفارش کرتا ہوں۔ سوئفٹ ان ڈیپتھ انٹرمیڈیٹ کا خلاصہ ایک اس بات کو یقینی بناتا ہے کہ تمام پراپرٹیز آباد ہیں اور کو کال کرتا ہے۔ نامزد انیشیلائزر super.init() ایک ایک نامزد انیشیلائزر کو کال کرکے ابتدا کو آسان بناتا ہے۔ سہولت انیشیلائزر ایک ذیلی طبقات کے لیے دستیاب نہیں ہو جاتا ہے اگر وہ نئی خصوصیات کا اعلان کرتے ہیں۔ سہولت شروع کرنے والا ایک سپر کلاس کے بحال کرنے کے لیے، اس کے تمام نامزد کردہ انیشیلائزرز کو اوور رائڈ کرنا ضروری ہے۔ سہولت انیشیلائزر کو اوور رائیڈز کی تعداد کو کم کرنے کے لیے، استعمال کیا جا سکتا ہے۔ سہولت اوور رائیڈ انیشیلائزر کمپائلر کی مدد ہم پہلے ہی بحث کر چکے ہیں کہ اگر ذیلی طبقہ نئے پیرامیٹرز کو متعارف نہیں کرواتا ہے، تو یہ خود بخود سپر کلاس کے تمام ابتدائیوں کو وراثت میں لے جاتا ہے۔ class Base { let value: Int init() { value = 0 } init(value: Int) { self.value = value } } class Subclass: Base { } let subclass = Subclass() // ✅ let subclass = Subclass(value: 3) // ✅ تاہم، ایک اور اہم نکتہ ہے: اگر سپرکلاس میں صرف ایک نامزد ابتدائیہ ہے اور یہ پیرامیٹر لیس ہے ( بغیر دلائل کے، تو پھر ذیلی کلاس میں واضح طور پر اعلان کردہ ابتدا کاروں کو کو کال کرنے کی ہے۔ اس صورت میں، سوئفٹ کمپائلر بغیر کسی دلیل کے دستیاب پر کال ۔ init() super.init() ضرورت نہیں super.init() داخل کرتا ہے class Base { init() { } } class Subclass: Base { let secondValue: Int init(secondValue: Int) { self.secondValue = secondValue // ✅ without explicit super.init() } } کوڈ مرتب کرتا ہے کیونکہ واضح طور پر کہا جاتا ہے۔ یہ مندرجہ ذیل مثالوں میں سے کچھ کے لیے اہم ہے۔ super.init() درکار ہے۔ ایک انیشیلائزر ان تمام صورتوں میں استعمال کیا جاتا ہے جہاں ایک ذیلی کلاس میں بیس کلاس کی طرح ایک ہی انیشیلائزر ہونا ضروری ہے۔ اسے کو بھی کال کرنا چاہیے۔ ذیل میں ایسی مثالیں دی گئی ہیں جہاں ایک ابتداء ضروری ہے۔ required super.init() required جنرک ایک عام قسم پر کال کرنا صرف اسے ایک قرار دے کر ہی ممکن ہے۔ init required init class Base { } class Subclass: Base { } struct Factory<T: Base> { func initInstance() -> T { // ❌ Constructing an object of class T() // type 'T' with a metatype value } // must use a 'required' initializer } یہ کوڈ مرتب نہیں ہوتا ہے کیونکہ کے ذیلی طبقات کے بارے میں کچھ نہیں معلوم۔ اگرچہ اس خاص معاملے میں، میں پیرامیٹرز کے بغیر ایک ہے، تصور کریں کہ کیا اس نے ایک نیا فیلڈ متعارف کرایا ہے: Factory Base Subclass init() class Subclass: Base { let value: Int init(value: Int) { self.value = value } } یہاں، اس میں اب کوئی خالی نہیں ہے، لہذا اسے کے مطابق قرار دیا جانا چاہیے۔ init required class Base { required init() { } } class Subclass: Base { } struct Factory<T: Base> { static func initInstance() -> T { // ✅ T() } } let subclass = Factory<Subclass>.initInstance() نوٹ کریں کہ اگرچہ ہم نے واضح طور پر میں اعلان نہیں کیا، لیکن مرتب کرنے والے نے اسے ہمارے لیے تیار کیا۔ اس پر میں تبادلہ خیال کیا گیا تھا۔ خود بخود وراثت میں ملا تھا اور اسے کہا جاتا تھا۔ Subclass required init کمپائلر اسسٹنس required init super.init() class Subclass: Base { required init() { super.init() } } پروٹوکولز پروٹوکول میں اعلان کردہ تمام ابتداء کی : required protocol Initable { init() } class InitableObject: Initable { init() { // ❌ Initializer requirement 'init()' can only // be satisfied by a 'required' initializer } // in non-final class 'InitableObject' } ایک بار پھر، یہ ضروری ہے تاکہ کمپائلر اس بات کو یقینی بنائے کہ ذیلی کلاس پروٹوکول انیشیلائزر کو لاگو کرتا ہے۔ جیسا کہ ہم پہلے ہی جانتے ہیں، ایسا ہمیشہ نہیں ہوتا — اگر نہیں ہے، ذیلی طبقے کو اس کو اوور رائڈ کرنے کا پابند نہیں ہے اور وہ خود اپنے ابتدائی کنندہ کی وضاحت کر سکتا ہے۔ init required class IntValue: InitableObject { let value: Int init(value: Int) { self.value = value } } let InitableType: Initable.Type = IntValue.self let initable: Initable = InitableType.init() یقینا، درج ذیل کوڈ مرتب نہیں ہوگا کیونکہ نہیں ہے۔ Base.init() required class InitableObject: Initable { required init() { } // ✅ } class IntValue: InitableObject { let value: Int required init() { self.value = 0 } init(value: Int) { self.value = value } } خود() اسی طرح کی صورتحال اس وقت ہوتی ہے جب انیشیلائزر کو جامد طریقوں میں کال کرتے ہیں۔ Self() class Base { let value: Int init(value: Int) { self.value = value } static func instantiate() -> Self { Self(value: 3) // ❌ Constructing an object of class type 'Self' } // with a metatype value must use a 'required' initializer } ہمیشہ کی طرح، مسئلہ وراثت میں ہے: class Subclass: BaseClass { let anotherValue: Int init(anotherValue: Int) { self.anotherValue = anotherValue } } let subclass = Subclass.instantiate() // ❌ class BaseClass { let value: Int required init(value: Int) { // ✅ self.value = value } static func instantiate() -> Self { Self(value: 3) } } سے چھٹکارا حاصل کرنا: required final چونکہ کا مقصد ذیلی طبقات میں ابتدائیہ کے نفاذ کو نافذ کرنا ہے، قدرتی طور پر، مطلوبہ لفظ کا استعمال کرتے ہوئے وراثت پر پابندی لگانا کے مطابق ابتدائیہ کو نشان زد کرنے کی ضرورت کو ختم کرتا ہے۔ required final required protocol Initable { init() } final class InitableObject: Initable { } // ✅ protocol ValueInitable { init(value: Int) } final class ValueInitableObject: ValueInitable { init(value: Int) { } // ✅ } انٹرمیڈیٹ کا خلاصہ اگر ایک ذیلی کلاس نئے پیرامیٹرز کو متعارف نہیں کراتی ہے، تو یہ خود بخود اپنے سپرکلاس سے تمام ابتداء کو وراثت میں لے لیتا ہے۔ اگر سپرکلاس میں صرف پیرامیٹرز کے بغیر ہے، تو اسے سب کلاس انیشیلائزرز میں خود بخود کہا جاتا ہے۔ init() generics، protocols، اور میں استعمال کے لیے ذیلی طبقات میں اس کی موجودگی کی ضمانت کے لیے ایک ابتداء کار کی ضرورت ہے۔ Self() required UIView() پیرامیٹرز کے بغیر انیشیلائزر کا مختصر تذکرہ، جو دستاویزات میں نہیں پایا جا سکتا لیکن ہر جگہ پراسرار طور پر استعمال ہوتا ہے۔ UIView() وجہ یہ ہے کہ سے وراثت میں ملتا ہے، جس میں پیرامیٹرز کے بغیر ہوتا ہے۔ ، اس ابتداء کار کو انٹرفیس میں واضح طور پر اعلان نہیں کیا گیا ہے، پھر بھی یہ دستیاب ہے: UIView NSObject init() لہذا UIView @available(iOS 2.0, *) @MainActor open class UIView : UIResponder, NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, UIFocusItemContainer, CALayerDelegate { open class var layerClass: AnyClass { get } public init(frame: CGRect) public init?(coder: NSCoder) open var isUserInteractionEnabled: Bool // no init() تاہم، ہڈ کے نیچے، یہ انیشیلائزر کہتا ہے جب کوڈ میں شروع کیا جاتا ہے یا جب انٹرفیس بلڈر کے ذریعے شروع کیا جاتا ہے۔ ایسا اس لیے ہوتا ہے کیونکہ کا اپنا نفاذ فراہم کرتا ہے، جس کی تصدیق اس حقیقت سے کی جا سکتی ہے کہ اور کے لیے مختلف پتے واپس کرتا ہے۔ init(frame:) init(coder:) UIView NSObject.init() method_getImplementation NSObject.init() UIView.init() معزز تذکرہ ناکام init ایک ناکام init صرف ایک ہے جو اختیاری لوٹاتا ہے۔ final class Failable { let positiveValue: Int init?(value: Int) { guard value > 0 else { return nil } positiveValue = value } } اینوم خام قیمت والے اینومس کو مفت init?(rawValue:) enum Direction: String { case north case west case south case east } let north = Direction(rawValue: "north") آپ enums کے لیے اپنی مرضی کے مطابق init بھی بنا سکتے ہیں۔ تمام enum inits کو تفویض کرنا ضروری ہے۔ self enum DeviceType { case phone case tablet init(screenWidth: Int) { self = screenWidth > 800 ? .tablet : .phone } } حتمی خلاصہ ہم نے Swift میں ابتدائیہ کے تمام ضروری پہلوؤں کا احاطہ کیا ہے: انیشیلائزر میں، تمام فیلڈز کو پاپولڈ ہونا چاہیے۔ اختیاری پراپرٹیز ڈیفالٹ سے ۔ var nil سٹرکچرز کو ایک مفت ملتا ہے۔ ممبر وائز انیشیلائزر جب ایک کسٹم انیشیلائزر کی تعریف کی جاتی ہے۔ ممبر وائز انیشیلائزر غائب ہو جاتا ہے ایک یقینی بناتا ہے کہ تمام فیلڈز آباد ہیں اور کو کال کرتا ہے۔ نامزد انیشیلائزر super.init() ایک ایک نامزد انیشیلائزر کو کال کرکے ابتدا کو آسان بناتا ہے۔ سہولت انیشیلائزر سہولت شروع کرنے والے ہمیشہ ہوتے ہیں ( )، اور نامزد انیشیلائزر ہوتے ہیں ( )۔ افقی self.init عمودی super.init ایک ذیلی طبقات کے لیے دستیاب نہیں ہو جاتا ہے اگر وہ نئی خصوصیات کا اعلان کرتے ہیں۔ سہولت شروع کرنے والا ایک سپر کلاس کے بحال کرنے کے لیے، اس کے تمام نامزد کردہ انیشیلائزرز کو اوور رائڈ کرنا ضروری ہے۔ سہولت انیشیلائزر کو اوور رائیڈز کی تعداد کو کم کرنے کے لیے، استعمال کیا جا سکتا ہے۔ سہولت اوور رائیڈ انیشیلائزر اگر ایک ذیلی کلاس نئے پیرامیٹرز کو متعارف نہیں کراتی ہے، تو یہ خود بخود اپنے سپرکلاس سے تمام ابتداء کو وراثت میں لے لیتا ہے۔ اگر سپر کلاس میں صرف پیرامیٹرز کے بغیر ہے، تو اسے خود بخود ذیلی کلاس انیشیلائزرز میں بلایا جاتا ہے۔ init() ایک generics، protocols، اور میں استعمال کے لیے ذیلی طبقات میں اپنی موجودگی کو یقینی بناتا ہے۔ مطلوبہ انیشیئلائزر Self() یا کال کرتا ہے۔ UIView.init() UIView.init(frame:) UIView.init(coder:) ایک ایک اختیاری واپس کرتا ہے۔ ناکام شروع کرنے والا خام قدر والے اینومس کو مفت ۔ init?(rawValue:) تمام enum ابتداء کرنے والوں کو تفویض کرنا ہوگا۔ self مجھے امید ہے کہ آپ نے اس مضمون میں کچھ مفید پایا۔ اگر کوئی چیز غیر واضح رہتی ہے یا آپ کو غلط معلوم ہوتا ہے، تو ٹیلیگرام پر مفت وضاحت کے لیے بلا جھجھک مجھ سے رابطہ کریں: ۔ @kfamyn متعلقہ لنکس سوئفٹ پروگرامنگ لینگویج (6) / ابتداء سوئفٹ ان ڈیپتھ بذریعہ Tjeerd in 't Veen ٹیلیگرام - @kfamyn