2015-05-23 15 views
8

द्वारा उत्पन्न जेनेरिक पैरामीटर स्विफ्ट की कॉन्वर्सिस की कमी के कारण, मुझे कुछ कामकाज की आवश्यकता थी। मैं जावा दुनिया से आ रहा हूं, इसलिए मैंने सहजता से एक प्रकार से अन्य सामान्य प्रकार तक बाधा उत्पन्न करने की कोशिश की।अन्य जेनेरिक पैरामीटर

class Factory<T: AnyObject> { 
    let factoryClosure:() -> T 

    init(closure:() -> T) { 
     factoryClosure = closure 
    } 

    init<CHILD: T>(childFactory: Factory<CHILD>) { 
     factoryClosure = {() -> T in 
      return otherFactory.create() 
     } 
    } 

    func create() -> T { 
     return factoryClosure() 
    } 
} 

मैं इस उम्मीद ठीक काम करने के लिए:

तो मैं निम्नलिखित वर्ग लिखा था। मेरे पास T परिभाषित है और CHILDT का उप-वर्ग होना चाहिए। स्विफ्ट कंपाइलर असहमत है और init<CHILD: T> के साथ लाइन पर निम्न त्रुटि दिखाता है। गैर प्रोटोकॉल, गैर वर्ग प्रकार से

विरासत 'टी'

मैं अलग परिदृश्य में सामान्य पैरामीटर विरासत के रूप में अच्छी तरह से करने की कोशिश की। निम्न विधि को कक्षा में जोड़ना (और संकलन त्रुटि उत्पन्न करने वाले init को हटा रहा है)।

func to<OTHER where OTHER: AnyObject, T: OTHER>() { 

} 

यह मूल रूप से वही आउटपुट उत्पन्न करता है।

प्रकार 'टी' गैर प्रोटोकॉल प्रकार के लिए विवश 'अन्य'

कुछ भी मैं हालांकि ऐसा नहीं किया और इसी तरह की त्रुटि संदेश के साथ समाप्त हो गया काम कर सकते हैं। क्या यह स्विफ्ट में एक बग है? या क्या मैं कुछ न कुछ भूल रहा हूं? या यह स्विफ्ट की एक विशेषता है और जैसा मैंने सोचा था कभी काम नहीं करेगा?

+0

आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं? वास्तविक लक्ष्य जो कुछ कोड के बजाय, अस्थिर लक्ष्य को प्राप्त करने की कोशिश कर रहा है, के बजाए है। –

+0

जिस लक्ष्य को मैं प्राप्त करने का प्रयास कर रहा हूं वह ऐसा कुछ है जो मुझे गायब कॉन्वर्सिस (यदि मुझे सही शब्द याद है) को काम करने की अनुमति दे। जावा में मैं 'फैक्टरी <का उपयोग करूंगा? MyObject> 'बढ़ाता है और' फैक्टरी 'के किसी भी उदाहरण में गुजर सकता है जिसमें' मायऑब्जेक्ट 'या उसके बच्चों का प्रकार पैरामीटर होगा। –

+0

वह अभी भी एक साधन की तरह लगता है अंत नहीं। वास्तविक लक्ष्य क्या है? –

उत्तर

0

आप किसी भी Factory<T> पास करना चाहते हैं जहां T प्रकार का है AnyObject तुम सिर्फ लिखने के लिए है:

init(childFactory: Factory<T>) { 
    factoryClosure = {() -> T in 
     return otherFactory.create() 
    } 
} 

क्योंकि टी स्वचालित रूप से अपने वर्ग द्वारा विवश है।

+0

इससे समस्या हल नहीं होगी, क्योंकि आप केवल 'फैक्ट्री' 'और नहीं 'फैक्टरी ' जहां 'जेड '' टी' का उप-वर्ग है। –

+0

मुझे लगता है कि यह आपकी समस्या हल करता है क्योंकि यदि 'ज़ेड' 'टी' का उप-वर्ग है तो यह 'AnyObject' प्रकार भी है।इसलिए आप 'फैक्टरी ' ('टी' 'किसी भी प्रकार के प्लेसहोल्डर को पास कर सकते हैं जो' AnyObject' 'के अनुरूप है – Qbyte

+0

संदर्भ में,' टी' पहले से ही आपके द्वारा बनाई जा रही कक्षा से बाधित है। तो यदि आप करते हैं 'zFactory = फैक्टरी () {वापसी Z()}; चलो tfactory = फैक्टरी (बाल फैक्टरी: zFactory) 'यह काम नहीं करेगा। –

संबंधित मुद्दे