2017-01-17 5 views
5

स्विफ्ट में हम इस तरह के अनुक्रम के रूप में सामान्य वस्तुओं पर एक्सटेंशन लिख सकते हैं अंदर एक सामान्य मद की टी बाध्य करें एक्सटेंशन केवल (इस मामले में) RxSwift अवलोकनों के अनुक्रमों पर लागू होता है।नेस्टेड जेनेरिक प्रतिबंध:</p> <pre><code>extension Sequence where Iterator.Element : ObservableType { } </code></pre> <p>इस बात की गारंटी होगा: एक सामान्य अनुक्रम विस्तार है जो कि सामान्य प्रकार के लिए विवश है

हालांकि यदि तत्व बाधा एक और सामान्य है तो क्या आप उस सामान्य को रोक सकते हैं? उदा .:

extension Sequence where Iterator.Element : ObservableType where E : MyType { 

} 

ऊपर छद्म कोड में (वह काम नहीं करता) आशय कहना है:

इस विस्तार के प्रत्यक्ष के दृश्यों पर लागू होना चाहिए जहां प्रत्यक्ष प्रकार के MyType जैसे एक मानने योग्य है [प्रत्यक्ष]

उत्तर

2

आप ObservableType के अनुरूप प्रकार के Iterator.Element सीमित कर सकते हैं और फिर संबद्ध प्रकार Iterator.Element की E के लिए एक और बाधा जोड़ें:

protocol ObservableType { 
    associatedtype E 
    // ... 
} 

class MyType { } 

extension Sequence where Iterator.Element: ObservableType, Iterator.Element.E: MyType { 

} 
+1

हालांकि काफी समानता नहीं है यही कारण है कि यह क्या है? अनुक्रम तत्व पर दो बाधाएं हैं? एक बाधा के बजाय कि तत्व जेनेरिक होना चाहिए कि उस जेनेरिक के भीतर क्या होना चाहिए? या क्या आपका मतलब है कि दूसरा टुकड़ा ObservableType.Element.E होगा? (कोशिश करने के लिए चला जाता है) – Cargowire

+0

@ कारगोवायर: उपरोक्त कोड एक्सटेंशन को माइक्लास से प्राप्त एक संबंधित प्रकार के साथ अवलोकनों के अनुक्रमों तक सीमित करता है। शायद मैं कुछ दिख रहा हूं या गलतफहमी कर रहा हूं - क्या आपको इसकी आवश्यकता से अलग है? किस मामले में यह इरादा के रूप में काम नहीं करेगा? –

+1

gah आप सही हैं मैं दूसरी बाधा को 'Iterator.Element.E' के बजाय 'Iterator.Element' के रूप में गलत तरीके से पढ़ रहा था! – Cargowire

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