as
उपयोग करने के लिए इस्तेमाल किया और टाइप करने के लिए कास्टिंग प्रकार bridged करने के लिए
as?
सुरक्षित कास्टिंग के लिए उपयोग किया जाता है, यदि विफल हो तो वापसी करें
as!
कास्ट करने के लिए उपयोग किया जाता है, यदि विफल रहा तो क्रैश
ध्यान दें:
as!
वैकल्पिक करने के लिए कच्चे प्रकार कास्ट नहीं कर सकते
उदाहरण:
let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)
let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)
उदाहरण
var age: Int? = nil
var height: Int? = 180
जोड़कर ? डेटा प्रकार के तुरंत बाद आप संकलक को बताते हैं कि चर में एक संख्या हो सकती है या नहीं। साफ! ध्यान दें कि यह वास्तव में वैकल्पिक स्थिरांक को परिभाषित करने का कोई मतलब नहीं है - आप केवल एक बार उनका मूल्य निर्धारित कर सकते हैं और इसलिए आप यह कहने में सक्षम होंगे कि उनका मूल्य शून्य होगा या नहीं।
जब हमें "का उपयोग करना चाहिए?" और कब "!"
मान लीजिए कि हमारे पास UIKit आधारित सरल ऐप है। हमारे पास हमारे व्यू कंट्रोलर में कुछ कोड है और इसके ऊपर एक नया व्यू कंट्रोलर प्रस्तुत करना चाहता है। और हमें नेविगेशन कंट्रोलर का उपयोग करके स्क्रीन पर नए दृश्य को पुश करने का निर्णय लेने की आवश्यकता है।
जैसा कि हम जानते हैं कि प्रत्येक ViewController उदाहरण में एक संपत्ति नेविगेशन नियंत्रक है। यदि आप नेविगेशन कंट्रोलर आधारित ऐप बना रहे हैं तो आपके ऐप के मास्टर व्यू कंट्रोलर की यह संपत्ति अपने आप सेट हो जाती है और आप इसका इस्तेमाल कंट्रोलर्स को पुश या पॉप करने के लिए कर सकते हैं। यदि आप एकल एप्लिकेशन प्रोजेक्ट टेम्पलेट का उपयोग करते हैं - तो आपके लिए स्वचालित रूप से बनाया गया नेविगेशन नियंत्रक नहीं होगा, इसलिए आपके ऐप के डिफ़ॉल्ट दृश्य नियंत्रक के पास नेविगेशनकंट्रोलर संपत्ति में संग्रहीत कुछ भी नहीं होगा।
मुझे यकीन है कि आप पहले से ही अनुमान लगा चुके हैं कि यह एक वैकल्पिक डेटाटाइप के लिए एक मामला है। यदि आप UIViewController की जाँच करते हैं, तो आप देखेंगे कि संपत्ति के रूप में परिभाषित किया गया है:
var navigationController: UINavigationController? { get }
तो चलिए अपने उपयोग के मामले पर वापस आते हैं। यदि आप इस तथ्य के लिए जानते हैं कि आपके दृश्य नियंत्रक में हमेशा एक नेविगेशन नियंत्रक होगा जिसे आप आगे बढ़ सकते हैं और इसे खोल सकते हैं:
controller.navigationController!.pushViewController(myViewController, animated: true)
जब आप एक डाल! संपत्ति के नाम के पीछे आप संकलक को बताएं कि मुझे परवाह नहीं है कि यह संपत्ति वैकल्पिक है, मुझे पता है कि जब यह कोड निष्पादित होता है तो हमेशा एक मूल्य स्टोर होगा इसलिए इस वैकल्पिक को एक सामान्य डेटाटाइप की तरह व्यवहार करें। अच्छा है कि अच्छा नहीं है? हालांकि अगर आपके व्यू कंट्रोलर के लिए नेविगेशन कंट्रोलर नहीं है तो क्या होगा? यदि आप सुझाव देते हैं कि हमेशा नेविगेशनकोंट्रोलर में संग्रहीत मूल्य गलत होगा? आपका ऐप क्रैश हो जाएगा। सरल और बदसूरत के रूप में।
तो, का उपयोग करें! केवल अगर आप 101% सुनिश्चित हैं कि यह सुरक्षित है।
कैसे के बारे में यदि आप सुनिश्चित नहीं हैं कि हमेशा एक नेविगेशन नियंत्रक होगा? तब आप उपयोग कर सकते हैं? के बजाय एक !:
controller.navigationController?.pushViewController(myViewController, animated: true)
क्या ? प्रॉपर्टी के नाम के पीछे कंपाइलर बताता है कि मुझे नहीं पता कि इस प्रॉपर्टी में एनआईएल है या वैल्यू है, इसलिए: अगर इसका वैल्यू यूज है, और ओटवाइज सिर्फ पूरे एक्सप्रेशन को मानते हैं। प्रभावी रूप से? आपको उस संपत्ति का उपयोग करने की अनुमति देता है बस मामले में एक नेविगेशन नियंत्रक है। किसी प्रकार की जाँच या किसी भी प्रकार की कास्टिंग नहीं। यह सिंटैक्स सही है जब आपको परवाह नहीं है कि आपके पास एक नेविगेशन नियंत्रक है या नहीं, और केवल तभी कुछ करना चाहता है।
फंताजेक के लिए बहुत धन्यवाद