दिलचस्प पोस्ट
मैं सरल डेटाबेस और वेबसैक्यिटी के साथ अपने डेटाबेस का उपयोग कैसे करूं? MVC4 सुरक्षा क्या है? मैं एमवीसी 4 में एक आंशिक दृश्य के लिए पैरामीटर कैसे पारित कर सकता हूं I JavaScript का उपयोग करके <textarea> पंक्तियों की संख्या कैसे प्राप्त करें? स्क्रीनशॉट की आईओएस जांच पिछले नंबर को दोहराए बिना गणित यादृच्छिक संख्या पायथन में HTTP प्रतिसाद की वर्णसेट / एन्कोडिंग प्राप्त करने का एक अच्छा तरीका आपके द्वारा प्रदान की गई प्राधिकरण तंत्र समर्थित नहीं है। कृपया एडब्ल्यूएस 4-एचएमएसी-एसएचए 256 का उपयोग करें मेन-डीएक्स-सूची में बहुत अधिक कक्षाएं, मुख्य डेक्स क्षमता को पार किया गया क्रोम डेवलपर उपकरण: सीएसएस नियम को ओवरराइड करने का तरीका क्या है? आईओएस में एक 'कंटेनर व्यू' का उपयोग कैसे करें? अभिभावक गतिविधि से एक टुकड़ा विधि कॉलिंग AngularJS: एसिंक्रोनस डेटा के साथ सेवा आरंभ करें संस्करण `CXXABI_1.3.8 'नहीं मिला (द्वारा आवश्यक …) सीएसएस में मार्जिन पतन के नियम किस प्रकार लागू किए गए थे? एंड्रॉइड फोन पर फोन कॉल रिकॉर्ड करें?

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

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

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)

Solutions Collecting From Web of "स्विफ्ट में तुरंत लौटें"

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

 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)