/ / Swift 3 розширення, обмежене типом - generics, swift3, extension-method, rx-swift

Розширення Swift 3 обмежене типами - generics, swift3, extension-методами, rx-swift

Я хотів би розширити протокол 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. Той, що насправді допоміг мені зрозуміти це цей.