/ / स्विफ्ट 3 एक्सटेंशन एक प्रकार के लिए विवश है - जेनरिक, स्विफ्ट 3, एक्सटेंशन-मेथड्स, आरएक्स-स्विफ्ट

स्विफ्ट 3 एक्सटेंशन एक प्रकार के लिए बाध्य - जेनरिक, स्विफ्ट 3, एक्सटेंशन-विधियां, आरएक्स-स्विफ्ट

मैं "" एक RXSwift प्रोटोकॉल का विस्तार करना चाहता हूंOsbervableConvertibleType, लेकिन मैं केवल OsbervableConvertibleTypes पर केवल एक विस्तार विधि बनाना चाहता हूं, जिसमें उनका एक परिणाम है। अब, परिणाम फिर से सामान्य है। लेकिन मैं अपने एक्सटेंशन फ़ंक्शन में जेनेरिक प्रकार को बनाए रखना चाहता हूं, इसलिए मेरे फ़ंक्शन का रिटर्न प्रकार सामान्य भी है।

extension ObservableConvertibleType where E: Result<T> {
public func asResultDriver() -> RxCocoa.SharedSequence<RxCocoa.DriverSharingStrategy, Result<T>> {
return self.asObservable()
.filter { $0.isSuccess }
.map { $0.value! }
.asDriver { _ in Driver.empty() }
}
}

क्या स्विफ्ट 3 में यह संभव है?

धन्यवाद!

उत्तर:

जवाब के लिए 2 № 1

आप जो करना चाहते हैं वह संभव है, लेकिन आपको एक मध्यवर्ती प्रोटोकॉल पेश करना होगा, क्योंकि स्विफ्ट 3 सामान्य प्रकार के साथ एक्सटेंशन का समर्थन नहीं करता है।

protocol ResultType {
associatedtype Value

var isSuccess: { Bool }
var value: Value?
}

extension Result: ResultType { }

इससे आपको बेस प्रोटोकॉल मिलता है ResultType, जिसे आप "के भीतर उपयोग कर पाएंगे ObservableConvertibleType विस्तार

extension ObservableConvertibleType where E: ResultType {
public func asResultDriver() -> RxCocoa.SharedSequence<RxCocoa.DriverSharingStrategy, Result<E.Value>> {
return self.asObservable()
.filter { $0.isSuccess }
.map { $0.value! }
.asDriver { _ in Driver.empty() }
}
}

यदि आप अधिक पढ़ना चाहते हैं, तो इस तकनीक के बारे में बहुत सारे लेख हैं जो Google के आसपास पड़े हुए हैं। वह जो वास्तव में मुझे समझने में मदद करता था वह था यह वाला.