Протокол RxSwift и конкретные типы - PullRequest
1 голос
/ 24 апреля 2020

У меня проблемы с BehaviorRelay, который имеет тип протокола, и использую его на конкретных типах. Вот мой код:

protocol Item {

    var title: { get }

}

struct Can: Item {

    let title = "Can"

}

let canRelay = BehaviorRelay<Can?>(value: nil)

func handle(item: BehaviorRelay<Item?>) {
    // do something with item here
}

handle(item: canRelay) // can't do this?

Я предполагал, что смогу вызвать handle(item:), но это не так, потому что аргументы не совпадают. Я понимаю, что они не совпадают, но Can - это тип Item, так разве это не возможно?

1 Ответ

2 голосов
/ 24 апреля 2020

Can может быть подтипом Item, но BehaviorRelay<Can> является , а не подтипом BehaviorRelay<Item>.

Кроме того, вы не должны передавать BehaviorRelays в код. Вместо этого пройдите Observables.

Как только вы знаете эти два правила, вы получите:

func handle(item: Observable<Item?>) {
    // do something with item here
}

handle(item: canRelay.map { $0 })
...