मैं एक UIViewController
एक विधि से MyProtocol
के अनुरूप वापस आना चाहते, तो मैं विधि हस्ताक्षर का उपयोग कर रहा:जेनेरिक्स - "सामान्य पैरामीटर 'टी' निष्कर्ष निकाला नहीं जा सका
func myMethod<T where T : UIViewController, T : MyProtocol>() -> T {
पहली बात मुझे समझ नहीं आता: अगर myMethod
रिटर्न एक MyViewController
जो हस्ताक्षर के बाद किया है जैसे, मैं डाली यह मजबूर करने के लिए है:
class MyViewController: UIViewController, MyProtocol
मैं बस return MyViewController()
नहीं कर सकते हैं लेकिन मैं इस तरह यह कास्ट करने के लिए की जरूरत है: return MyViewController() as! T
- ऐसा क्यों है necessar y?
और दूसरी बात: मैं इस विधि का कहीं और उपयोग कैसे कर सकता हूं? मैं बस
let x = myMethod() as? UIViewController
नहीं कह सकता, जैसा कि मैंने त्रुटि कुछ इस तरह
Generic parameter 'T' could not be inferred
मैं कैसे प्राप्त कर सकते हैं? अगर मैं इसे MyViewController
पर डालता हूं तो यह काम करता है, लेकिन मैं निश्चित रूप से इससे बचना चाहता हूं।
संपादित करें: उदाहरण
class MyViewController : UIViewController, MyProtocol {
}
protocol MyProtocol {
}
func myMethod<T>() -> T where T : UIViewController, T : MyProtocol {
return MyViewController() as! T // why is the cast necessary?
}
ठीक है, मैं एक हिस्सा मिलता है, लेकिन क्यों T
के कलाकारों के लिए आवश्यक है? MyViewController
UIViewController
का उप-वर्ग है और प्रोटोकॉल के अनुरूप है, इसलिए कोई कलाकार आवश्यक नहीं होना चाहिए, है ना?
आप यहां क्या हासिल करने की कोशिश कर रहे हैं? आप जेनेरिक का उपयोग पहली जगह क्यों कर रहे हैं? – Alexander
मैं एक प्रकार के साथ काम करना चाहता हूं जो 'UIViewController' है और विशिष्ट प्रोटोकॉल के अनुरूप है; मेरे पास अलग-अलग वर्ग हैं जो इस नियमों के अनुरूप हैं, इसलिए मैं एक विशिष्ट प्रकार का उपयोग नहीं करना चाहता हूं। – swalkner
क्या आप उत्तर स्वीकार नहीं करना चाहते हैं? – Honey