Swift साक्षात्कार कैसे पास करें: उन्नत स्तर के शीर्ष प्रश्न

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Swift साक्षात्कार कैसे पास करें: उन्नत स्तर के शीर्ष प्रश्न



iOS डेवलपर पद के लिए साक्षात्कार केवल UIKit और SwiftUI के ज्ञान की जाँच नहीं है। उन्नत स्तर पर, भर्तीकर्ता और तकनीकी लीड यह सुनिश्चित करना चाहते हैं कि आप समझते हैं कि मेमोरी कैसे काम करती है, reference counting के संदर्भ में class और struct में क्या अंतर है, प्रोटोकॉल का उपयोग करके आर्किटेक्चर को सही तरीके से कैसे बनाया जाए, और एसिंक्रोनसी को कैसे प्रबंधित किया जाए। इस लेख में, हम उन प्रमुख विषयों पर चर्चा करेंगे जो अक्सर Middle और Senior स्तर के Swift साक्षात्कारों में पूछे जाते हैं।



1. मेमोरी प्रबंधन और ARC (Automatic Reference Counting)



ARC इंटरव्यू में सबसे आम विषयों में से एक है। आपको केवल सिद्धांत जानने की आवश्यकता नहीं है, बल्कि यह भी समझाने में सक्षम होना चाहिए कि मेमोरी लीक से कैसे बचा जाए।



1.1. ARC कैसे काम करता है और मजबूत संदर्भ चक्र क्या होते हैं?



ARC स्वचालित रूप से क्लास ऑब्जेक्ट पर मजबूत संदर्भों की संख्या गिनता है। जैसे ही काउंटर शून्य हो जाता है, ऑब्जेक्ट मेमोरी से हटा दिया जाता है। समस्या तब उत्पन्न होती है जब दो ऑब्जेक्ट एक-दूसरे को मजबूती से संदर्भित करते हैं - एक चक्र (retain cycle) बनता है।



class Parent {    var child: Child?}

class Child { var parent: Parent? // वापस मजबूत संदर्भ}

var parent: Parent? = Parent()var child: Child? = Child()parent?.child = childchild?.parent = parent// दोनों ऑब्जेक्ट कभी मुक्त नहीं होंगे


1.2. चक्र को कैसे तोड़ें?



weak या unowned का उपयोग करें। weak एक वैकल्पिक संदर्भ है जो ऑब्जेक्ट के हटाए जाने पर स्वचालित रूप से nil हो जाता है। unowned गैर-वैकल्पिक है, लेकिन यह मानता है कि ऑब्जेक्ट कम से कम संदर्भित करने वाले ऑब्जेक्ट जितनी देर तक जीवित रहेगा।



class Child {    weak var parent: Parent?  // कमजोर संदर्भ}


1.3. ARC क्लोजर के साथ कैसे काम करता है?



क्लोजर बाहरी चर को कैप्चर करते हैं। यदि क्लोजर को क्लास की प्रॉपर्टी के रूप में संग्रहीत किया जाता है, और इसके अंदर self का उपयोग किया जाता है, तो एक चक्र उत्पन्न होता है। समाधान [weak self] या [unowned self] का उपयोग करना है।



class NetworkManager {    var completionHandler: (() -> Void)?        func fetchData() {        completionHandler = { [weak self] in            guard let self = self else { return }            self.processData()        }    }        func processData() { }}


2. क्लोजर और escaping बनाम non-escaping



escaping और non-escaping क्लोजर के बीच अंतर को समझना किसी भी उन्नत पद के लिए अनिवार्य है।



2.1. escaping क्लोजर क्या है?



क्लोजर को escaping कहा जाता है यदि इसे फ़ंक्शन से वापसी के बाद कॉल किया जा सकता है। डिफ़ॉल्ट रूप से, सभी क्लोजर non-escaping होते हैं - कंपाइलर जानता है कि वे फ़ंक्शन के बॉडी के अंदर निष्पादित होंगे। एसिंक्रोनस ऑपरेशंस (जैसे नेटवर्क अनुरोध) के लिए, स्पष्ट रूप से @escaping निर्दिष्ट करना आवश्यक है।



func performAsyncTask(completion: @escaping (String) -> Void) {    DispatchQueue.global().async {        // लंबे कार्य का अनुकरण        sleep(2)        completion("तैयार")    }}


2.2. non-escaping क्लोजर तेज़ क्यों होते हैं?



कंपाइलर non-escaping क्लोजर को अनुकूलित करता है - वह उन्हें हीप (heap) पर कॉपी करने के बजाय स्टैक पर संग्रहीत कर सकता है। साथ ही, वह संदर्भ गणना से बच सकता है, क्योंकि क्लोजर का जीवनकाल फ़ंक्शन कॉल तक सीमित होता है।



3. जेनेरिक्स और एसोसिएटेड टाइप्स (PAT) वाले प्रोटोकॉल



जेनेरिक्स Swift का आधार हैं। साक्षात्कार में, आपको एक सामान्य संरचना लिखने या यह समझाने के लिए कहा जा सकता है कि एसोसिएटेड टाइप्स वाले प्रोटोकॉल कैसे काम करते हैं।



3.1. एक जेनेरिक कतार (Queue) लिखें



struct Queue<T> {    private var elements: [T] = []        mutating func enqueue(_ value: T) {        elements.append(value)    }        mutating func dequeue() -> T? {        guard !elements.isEmpty else { return nil }

ब्लॉग

पुस्तक अनुशंसाएँ