/ / Swift 3 rozszerzenie ograniczone do typu - generics, swift3, extension-methods, rx-swift

Swift 3 rozszerzenie ograniczone do typu - generics, swift3, extension-methods, rx-swift

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 № 1

To, 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.