अपडेट: से स्विफ्ट 2.2 परिवर्तन लॉग (21 मार्च, वर्ष 2016 को जारी):
पदनामित या फेंकने के रूप में घोषित नामित वर्ग इनिशियलाइज़र अब ऑब्जेक्ट को पूरी तरह से इनिशियलाइज़ किए जाने से पहले, क्रमशः शून्य वापस कर सकते हैं या एक त्रुटि फेंक सकते हैं।
स्विफ्ट 2.1 और उससे पहले के लिए:
Apple के दस्तावेज़ीकरण (और आपकी संकलक त्रुटि) के अनुसार, एक वर्ग को अपने सभी संग्रहित गुणों को nilआरंभिक संपीड़ित से लौटने से पहले प्रारंभ करना होगा:
कक्षाओं के लिए, हालाँकि, एक फेलियर इनिशियलाइज़र इनिशियलाइज़ेशन विफलता को तभी ट्रिगर कर सकता है, जब उस क्लास द्वारा शुरू की गई सभी संग्रहीत संपत्तियों को एक प्रारंभिक मूल्य पर सेट किया गया हो और किसी भी इनिशियलाइज़र के प्रतिनिधिमंडल को जगह मिली हो।
नोट: यह वास्तव में संरचनाओं और गणनाओं के लिए ठीक काम करता है, केवल कक्षाएं नहीं।
संग्रहित संपत्तियों को संभालने का सुझाया गया तरीका जो कि आरंभिक विफल होने से पहले आरंभीकृत नहीं किया जा सकता है, उन्हें घोषित रूप से अपरिवर्तित वैकल्पिक के रूप में घोषित करना है।
डॉक्स से उदाहरण:
class Product {
let name: String!
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
ऊपर दिए गए उदाहरण में, उत्पाद वर्ग की नाम संपत्ति को एक अंतर्निहित अलिखित वैकल्पिक स्ट्रिंग प्रकार (स्ट्रिंग!) के रूप में परिभाषित किया गया है। क्योंकि यह एक वैकल्पिक प्रकार का है, इसका मतलब यह है कि नाम की संपत्ति में शून्य का एक डिफ़ॉल्ट मूल्य है इससे पहले कि इसे आरंभीकरण के दौरान एक विशिष्ट मूल्य सौंपा जाए। बदले में एनआईएल के इस डिफ़ॉल्ट मूल्य का मतलब है कि उत्पाद वर्ग द्वारा पेश किए गए सभी गुणों का एक मान्य प्रारंभिक मूल्य है। नतीजतन, उत्पाद के लिए अनुपलब्ध इनिशियलाइज़र इनिशियलाइज़र की शुरुआत में एक इनिशियलाइज़ेशन विफलता को ट्रिगर कर सकता है यदि यह एक खाली स्ट्रिंग पारित किया जाता है, इनिशियलाइज़र के भीतर नाम संपत्ति के लिए एक विशिष्ट मूल्य निर्दिष्ट करने से पहले।
आपके मामले में, तथापि, बस को परिभाषित करने userNameके रूप में एक String!संकलन त्रुटि को ठीक नहीं है, क्योंकि आप अभी भी अपने आधार वर्ग पर गुण आरंभ के बारे में चिंता करने की जरूरत है, NSObject। सौभाग्य से, userNameएक के रूप में परिभाषित के साथ String!, आप वास्तव में super.init()आपके सामने कॉल कर सकते हैं return nilजो आपके NSObjectआधार वर्ग को सम्मिलित करेगा और संकलन त्रुटि को ठीक करेगा।
class User: NSObject {
let userName: String!
let isSuperUser: Bool = false
let someDetails: [String]?
init?(dictionary: NSDictionary) {
super.init()
if let value = dictionary["user_name"] as? String {
self.userName = value
}
else {
return nil
}
if let value: Bool = dictionary["super_user"] as? Bool {
self.isSuperUser = value
}
self.someDetails = dictionary["some_details"] as? Array
}
}
canSetCalculablePropertiesबूलियन पैरामीटर जोड़ा, जो मेरे शुरुआती को उन संपत्तियों की गणना करने की अनुमति देता है जो मक्खी पर बनाई जा सकती हैं या नहीं बनाई जा सकती हैं। उदाहरण के लिए, यदि कोईdateCreatedकुंजी गायब है और मैं संपत्ति को मक्खी पर सेट कर सकता हूं क्योंकिcanSetCalculablePropertiesपैरामीटर सत्य है, तो मैं इसे वर्तमान तिथि पर सेट करता हूं।