Я хотів би розширити протокол RXSwift, а самеOsbervableConvertibleType, але я хочу створити метод розширення лише для OsbervableConvertibleTypes, який має в них об'єкт Result. Тепер Результат знову загальний. Але я хотів би зберегти загальний тип у своїй функції розширення, тому тип повернення моєї функції також є загальним. Щось таке:
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() }
}
}
Чи можливо в Swift 3?
Дякую!
Відповіді:
2 для відповіді № 1Те, що ви хочете зробити, можливо, але вам потрібно буде ввести проміжний протокол, оскільки Swift 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. Той, що насправді допоміг мені зрозуміти це цей.