दिलचस्प पोस्ट
इंटरफ़ेस स्थिरांक का क्या उपयोग है? AngularJs के साथ jQuery के UI Datepicker क्या .NET (C # या VB.NET) के लिए कोई UPnP लाइब्रेरी है? NSUserDefaults में छवियों को सहेजें? एक UITableView में चुटकी बहु स्पर्श इशारों को देखकर एक MySQL तालिका, अनुक्रमित और डेटा को डुप्लिकेट करना यदि कोई सूचना दिखाई दे रही है, तो उपयोगकर्ता "स्क्रीन ओवरले का पता लगाया" संदेश को अनुमति देने का प्रयास कर रहा है वर्ड फ़ाइल .doc, docx, .xlsx, .pptx php से पाठ निकालने का तरीका FFmpeg छवियों से वीडियो बनाने के लिए सी # के प्रयोग से, यह कैसे पता चलता है कि किस प्रक्रिया ने एक फाइल लॉक की है? क्या टेम्पलेट तर्क (हस्ताक्षर) std :: function भाग का प्रकार नहीं है? नॉकआउट में अद्यतन नहीं करने योग्य अवलोकन के मूल्य निर्धारित करना मैं स्वत: पूर्ण प्लग-इन परिणामों को कैसे अनुकूलित कर सकता हूं? CSS3 घुमाएगी एनिमेशन Getters और setters / accessors क्यों का उपयोग करें?

स्विफ्ट में तुरंत लौटें

मैं यह एक्सटेंशन बनाने का प्रयास कर रहा हूं:

extension UIViewController { class func initialize(storyboardName: String, storyboardId: String) -> Self { let storyboad = UIStoryboard(name: storyboardName, bundle: nil) let controller = storyboad.instantiateViewControllerWithIdentifier(storyboardId) as! Self return controller } } 

लेकिन मुझे संकलन त्रुटि मिलती है:

त्रुटि: प्रकार 'स्व' पर वापस लौटने के लिए 'UIViewController' प्रकार की वापसी अभिव्यक्ति को परिवर्तित नहीं किया जा सकता

क्या यह संभव है? इसके अलावा मैं इसे init(storyboardName: String, storyboardId: String) रूप में बनाना चाहता हूं init(storyboardName: String, storyboardId: String)

वेब के समाधान से एकत्रित समाधान "स्विफ्ट में तुरंत लौटें"

स्विफ्ट में क्लास एक्सटेंशन कार्यों में 'स्व' का उपयोग करने के समान, आप एक सामान्य सहायक पद्धति को परिभाषित कर सकते हैं जो कॉलिंग प्रसंग से स्वयं के प्रकार का अनुमान लगाता है:

 extension UIViewController { class func instantiateFromStoryboard(storyboardName: String, storyboardId: String) -> Self { return instantiateFromStoryboardHelper(storyboardName, storyboardId: storyboardId) } private class func instantiateFromStoryboardHelper<T>(storyboardName: String, storyboardId: String) -> T { let storyboard = UIStoryboard(name: storyboardName, bundle: nil) let controller = storyboard.instantiateViewControllerWithIdentifier(storyboardId) as! T return controller } } 

फिर

 let vc = MyViewController.instantiateFromStoryboard("name", storyboardId: "id") 

compiles, और प्रकार MyViewController रूप में अनुमान लगाया गया है


स्विफ्ट 3 के लिए अपडेट :

 extension UIViewController { class func instantiateFromStoryboard(storyboardName: String, storyboardId: String) -> Self { return instantiateFromStoryboardHelper(storyboardName: storyboardName, storyboardId: storyboardId) } private class func instantiateFromStoryboardHelper<T>(storyboardName: String, storyboardId: String) -> T { let storyboard = UIStoryboard(name: storyboardName, bundle: nil) let controller = storyboard.instantiateViewController(withIdentifier: storyboardId) as! T return controller } } 

Self संकलित समय पर निर्धारित किया जाता है, रनटाइम नहीं। आपके कोड में, Self UIViewController बराबर है, न कि "यह कॉल करने वाला उपवर्ग।" यह UIViewController को वापस करने जा रहा है और कॉलर के as यह सही उप-वर्ग में होगा। मुझे लगता है कि आप क्या करने से बचने का प्रयास कर रहे थे (हालांकि यह "सामान्य कोको" है, ऐसा करने के लिए, बस UIViewController शायद सबसे अच्छा समाधान लौट रहा है)।

नोट: आपको किसी भी मामले में फ़ंक्शन को initialize नाम नहीं देना चाहिए। यह NSObject के एक मौजूदा वर्ग समारोह है और सबसे अच्छा में भ्रम का कारण बनता है, सबसे बुरी पर कीड़े।

लेकिन अगर आप कॉलर से बचने के लिए चाहते हैं, तो उप-क्लासिंग आमतौर पर स्विफ्ट में कार्यक्षमता जोड़ने के लिए टूल नहीं है। इसके बजाय, आप आमतौर पर जेनेरिक और प्रोटोकॉल चाहते हैं। इस मामले में, जेनेरिक आप सभी की जरूरत है।

 func instantiateViewController<VC: UIViewController>(storyboardName: String, storyboardId: String) -> VC { let storyboad = UIStoryboard(name name: storyboardName, bundle: nil) let controller = storyboad.instantiateViewControllerWithIdentifier(storyboardId) as! VC return controller } 

यह एक क्लास विधि नहीं है यह सिर्फ एक फ़ंक्शन है यहाँ एक कक्षा के लिए कोई ज़रूरत नहीं है

 let tvc: UITableViewController = instantiateViewController(name: name, storyboardId: storyboardId)