Chciałbym rozszerzyć protokół RXSwift, a mianowicieOsbervableConvertibleType, ale chcę tylko utworzyć metodę rozszerzenia tylko na OsbervableConvertibleTypes, który zawiera obiekt Result. Teraz wynik jest znowu ogólny. Ale chciałbym zachować rodzaj ogólny w mojej funkcji rozszerzenia, więc typ zwracania mojej funkcji jest również ogólny. Coś takiego:
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() }
}
}
Czy to możliwe w Swift 3?
Dzięki!
Odpowiedzi:
2 dla odpowiedzi № 1To, co chcesz zrobić, jest możliwe, ale będziesz musiał wprowadzić protokół pośredni, ponieważ Swift 3 nie obsługuje rozszerzenia o typie ogólnym.
protocol ResultType {
associatedtype Value
var isSuccess: { Bool }
var value: Value?
}
extension Result: ResultType { }
To daje podstawowy protokół ResultType
, z którego będziesz mógł korzystać w ramach ObservableConvertibleType
rozbudowa
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() }
}
}
Jeśli chcesz przeczytać więcej, istnieje wiele artykułów na temat tej techniki leżących wokół Google. Naprawdę pomógł mi to zrozumieć ten.